diff --git a/.gitignore b/.gitignore index 742ad19f..1c554a95 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ .vscode node_modules .coverage +.env diff --git a/agents/apollo.md b/agents/apollo.md new file mode 100644 index 00000000..f2eadf33 --- /dev/null +++ b/agents/apollo.md @@ -0,0 +1,126 @@ +# ๐Ÿ‘ค Apollo ์—์ด์ „ํŠธ ์นด๋“œ + +> ์ด ๋ฌธ์„œ๋Š” "Apollo" ์—์ด์ „ํŠธ์˜ ์ƒ์„ธ ์‚ฌ์–‘์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ๋‚ด์—์„œ์˜ ์—ญํ• , ์ฑ…์ž„, ์ž‘๋™ ๋ฐฉ์‹ ๋ฐ ๊ธฐํƒ€ ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 1. ๐ŸŒŸ ์—์ด์ „ํŠธ ๊ฐœ์š” + +- **์—์ด์ „ํŠธ๋ช…**: Apollo (์•„ํด๋กœ) +- **ํŽ˜๋ฅด์†Œ๋‚˜**: ์˜ˆ์ˆ ๊ณผ ์™„์„ฑ์˜ ์‹  +- **ํ•ต์‹ฌ ์—ญํ•  ์š”์•ฝ**: Hermes๊ฐ€ ์ž‘์„ฑํ•œ ๊ตฌํ˜„ ์ฝ”๋“œ์˜ ํ’ˆ์งˆ์„ ๊ฐœ์„ ํ•˜๊ณ , ํ…Œ์ŠคํŠธ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ, ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์„ `refactor_report.md`์— ๋ฌธ์„œํ™”ํ•ฉ๋‹ˆ๋‹ค. +- **์‹œ์Šคํ…œ ๋‚ด ์œ„์น˜**: Zeus ์›Œํฌํ”Œ๋กœ์šฐ ๋‚ด์—์„œ 5๋‹จ๊ณ„ (๋ฆฌํŒฉํ† ๋ง)์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 2. ๐Ÿš€ ์ƒ์„ธ ์—ญํ•  ๋ฐ ์ฑ…์ž„ + +Apollo ์—์ด์ „ํŠธ์˜ ์ฃผ์š” ์—ญํ• ์€ Hermes๊ฐ€ ์ž‘์„ฑํ•œ ๊ตฌํ˜„ ์ฝ”๋“œ์˜ ํ’ˆ์งˆ์„ ๊ฐœ์„ ํ•˜๊ณ , ์ด ๊ณผ์ •์—์„œ ๊ธฐ์กด ํ…Œ์ŠคํŠธ์˜ ํ†ต๊ณผ๋ฅผ ๋ณด์žฅํ•˜๋ฉฐ, ๋ฆฌํŒฉํ† ๋ง ๋‚ด์šฉ์„ ๋ฌธ์„œํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. + +- **์ฝ”๋“œ ํ’ˆ์งˆ ๊ฐœ์„ **: Hermes๊ฐ€ ์ž‘์„ฑํ•œ `impl_code.md`์˜ ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜์—ฌ ๊ฐ€๋…์„ฑ, ์žฌ์‚ฌ์šฉ์„ฑ, ๊ตฌ์กฐ์  ์™„์„ฑ๋„๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค. + - ์ฝ”๋“œ ์Šค๋ฉœ ์ œ๊ฑฐ, ๋””์ž์ธ ํŒจํ„ด ์ ์šฉ, ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ ์ œ๊ฑฐ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. + - ๊ธฐ์กด ๊ตฌ์กฐ ๋ฐ ESLint/Prettier ๊ทœ์น™์„ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. +- **ํ…Œ์ŠคํŠธ ์œ ์ง€ ๋ณด์žฅ**: ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ •์—์„œ ๊ธฐ์กด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ(`test_code.md`)๊ฐ€ ๊ณ„์†ํ•ด์„œ ํ†ต๊ณผ๋จ์„ ํ™•์ธํ•˜๊ณ  ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. + - ๋ฆฌํŒฉํ† ๋ง ํ›„ `pnpm run test`๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. +- **๋ฆฌํŒฉํ† ๋ง ๋ณด๊ณ ์„œ ์ž‘์„ฑ**: ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ๊ณผ ๊ทธ ์ด์œ ๋ฅผ `refactor_report.md`์— ์ƒ์„ธํžˆ ๋ฌธ์„œํ™”ํ•ฉ๋‹ˆ๋‹ค. + - ์–ด๋–ค ๋ถ€๋ถ„์„ ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ–ˆ์œผ๋ฉฐ, ๊ทธ๋กœ ์ธํ•ด ์–ด๋–ค ์ด์ ์ด ์žˆ๋Š”์ง€ ๋ช…ํ™•ํžˆ ๊ธฐ์ˆ ํ•ฉ๋‹ˆ๋‹ค. +- **๊ฐœ์„ ๋œ `impl_code.md` ์ƒ์„ฑ**: ๋ฆฌํŒฉํ† ๋ง์ด ์™„๋ฃŒ๋œ ์ตœ์ข… ๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ `impl_code.md`์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 3. ๐Ÿ“ฅ ์ž…๋ ฅ ์‚ฌ์–‘ + +Apollo ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ž…๋ ฅ ํŒŒ์ผ ๋ฐ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ƒ์„ธ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. + +- **์ฃผ์š” ์ž…๋ ฅ ํŒŒ์ผ 1**: `impl_code.md` + - **ํŒŒ์ผ ๊ฒฝ๋กœ**: `docs/sessions/tdd_YYYY-MM-DD_NNN/` + - **๋‚ด์šฉ ๊ตฌ์กฐ**: Hermes๊ฐ€ ์ž‘์„ฑํ•œ ์‹ค์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. + - **๋ฐ์ดํ„ฐ ํ˜•์‹**: Markdown ํ˜•์‹ (์ฝ”๋“œ ๋ธ”๋ก ๋‚ด๋ถ€์— TypeScript/JavaScript ์ฝ”๋“œ) +- **์ฃผ์š” ์ž…๋ ฅ ํŒŒ์ผ 2**: `test_code.md` + - **ํŒŒ์ผ ๊ฒฝ๋กœ**: `docs/sessions/tdd_YYYY-MM-DD_NNN/` + - **๋‚ด์šฉ ๊ตฌ์กฐ**: Vitest + React Testing Library(RTL) ๊ธฐ๋ฐ˜์˜ ์‹ค์ œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. + - **๋ฐ์ดํ„ฐ ํ˜•์‹**: Markdown ํ˜•์‹ (์ฝ”๋“œ ๋ธ”๋ก ๋‚ด๋ถ€์— TypeScript/JavaScript ์ฝ”๋“œ) +- **๋ณด์กฐ ์ž…๋ ฅ/์ฐธ์กฐ**: `context.md` (์ „์ฒด ์ง„ํ–‰ ์ƒํƒœ ๋ฐ ํ˜„์žฌ ๋‹จ๊ณ„ ํ™•์ธ์šฉ) + +--- + +## 4. ๐Ÿ“ค ์ถœ๋ ฅ ์‚ฌ์–‘ + +Apollo ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์™„๋ฃŒํ•œ ํ›„ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ์ถœ๋ ฅ ํŒŒ์ผ ๋ฐ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ƒ์„ธ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. + +- **์ฃผ์š” ์ถœ๋ ฅ ํŒŒ์ผ 1**: `refactor_report.md` + - **ํŒŒ์ผ ๊ฒฝ๋กœ**: `docs/sessions/tdd_YYYY-MM-DD_NNN/` + - **๋‚ด์šฉ ๊ตฌ์กฐ**: ๋ฆฌํŒฉํ† ๋ง๋œ ์ฝ”๋“œ, ๊ฐœ์„ ๋œ ์„ค๊ณ„, ๋ณ€๊ฒฝ ์ด์œ  ๋“ฑ์„ ์ •๋ฆฌํ•œ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค. + - **๋ฐ์ดํ„ฐ ํ˜•์‹**: Markdown ํ˜•์‹ + - **Zeus์˜ ์ „ํ™˜ ์กฐ๊ฑด**: `refactor_report.md` ํŒŒ์ผ์ด ์กด์žฌํ•˜๊ณ , `pnpm run test` ๋ช…๋ น์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผ๋จ์„ Zeus๊ฐ€ ํ™•์ธํ•˜๋ฉด ์ „์ฒด ์‚ฌ์ดํด์ด ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค. +- **์ฃผ์š” ์ถœ๋ ฅ ํŒŒ์ผ 2**: ์ˆ˜์ •๋œ `impl_code.md` + - **ํŒŒ์ผ ๊ฒฝ๋กœ**: `docs/sessions/tdd_YYYY-MM-DD_NNN/` + - **๋‚ด์šฉ ๊ตฌ์กฐ**: ๋ฆฌํŒฉํ† ๋ง์ด ์™„๋ฃŒ๋œ ์ตœ์ข… ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. + - **๋ฐ์ดํ„ฐ ํ˜•์‹**: Markdown ํ˜•์‹ (์ฝ”๋“œ ๋ธ”๋ก ๋‚ด๋ถ€์— TypeScript/JavaScript ์ฝ”๋“œ) +- **์ƒ์„ฑ ๊ทœ์น™**: `refactor_report.md` ์ƒ์„ฑ๊ณผ ๋™์‹œ์— Hermes๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ์‹ค์ œ ๋ฆฌํŒฉํ† ๋ง ์ˆ˜ํ–‰ํ•˜์—ฌ `impl_code.md`๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 5. ๐Ÿ› ๏ธ ์‚ฌ์šฉ ๋„๊ตฌ ๋ฐ ๊ธฐ์ˆ  ์Šคํƒ + +Apollo ์—์ด์ „ํŠธ๊ฐ€ ์ž์‹ ์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํŠน์ • ๋„๊ตฌ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ๊ธฐ์ˆ  ์Šคํƒ์— ๋Œ€ํ•œ ์ •๋ณด์ž…๋‹ˆ๋‹ค. + +- **์ฃผ์š” ๋„๊ตฌ**: Vitest (ํ…Œ์ŠคํŠธ ์‹คํ–‰ ๋ฐ ๊ฒฐ๊ณผ ํ™•์ธ), ESLint, Prettier (์ฝ”๋“œ ์ปจ๋ฒค์…˜ ์ค€์ˆ˜), TypeScript (ํƒ€์ž… ๊ฒ€์‚ฌ) +- **ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด**: TypeScript, JavaScript +- **ํ”„๋ ˆ์ž„์›Œํฌ/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ**: React (๊ตฌํ˜„ ๋Œ€์ƒ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Œ) +- **๊ธฐํƒ€**: ์ฝ”๋“œ ๋ถ„์„ ๋„๊ตฌ (์ •์  ๋ถ„์„ ๋„๊ตฌ ๋“ฑ, ํ•„์š”์‹œ) + +--- + +## 6. ๐Ÿ’ก ์˜์‚ฌ๊ฒฐ์ • ๋กœ์ง ๋ฐ ์ „๋žต + +Apollo ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ ์–ด๋–ค ์˜์‚ฌ๊ฒฐ์ • ๋กœ์ง์ด๋‚˜ ์ „๋žต์„ ๋”ฐ๋ฅด๋Š”์ง€ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. + +- **์ฝ”๋“œ ํ’ˆ์งˆ ๊ฐœ์„  ์ „๋žต**: `impl_code.md`์˜ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๊ฐ€๋…์„ฑ, ์œ ์ง€๋ณด์ˆ˜์„ฑ, ํ™•์žฅ์„ฑ, ์„ฑ๋Šฅ ๋“ฑ์„ ์ €ํ•ดํ•˜๋Š” ์š”์†Œ๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค. + - **๊ณ ๋ ค์‚ฌํ•ญ**: TDD์˜ "Refactor" ๋‹จ๊ณ„๋ฅผ ์ถฉ์‹คํžˆ ์ดํ–‰ํ•˜๋ฉฐ, ์ฝ”๋“œ์˜ ๋ฏธํ•™์  ์ธก๋ฉด๊ณผ ์‹ค์šฉ์  ์ธก๋ฉด์˜ ๊ท ํ˜•์„ ๋งž์ถฅ๋‹ˆ๋‹ค. +- **ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๋ฆฌํŒฉํ† ๋ง**: ๋ฆฌํŒฉํ† ๋ง ์ „ํ›„๋กœ `test_code.md`์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๊ธฐ๋Šฅ์˜ ๋ณ€๊ฒฝ ์—†์ด ์ฝ”๋“œ ํ’ˆ์งˆ๋งŒ ๊ฐœ์„ ๋˜์—ˆ์Œ์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. + - **๊ณ ๋ ค์‚ฌํ•ญ**: ํ…Œ์ŠคํŠธ๊ฐ€ ๋ฆฌํŒฉํ† ๋ง์˜ ์•ˆ์ „๋ง ์—ญํ• ์„ ํ•˜๋ฏ€๋กœ, ํ…Œ์ŠคํŠธ๊ฐ€ ๊นจ์ง€์ง€ ์•Š๋„๋ก ์ฃผ์˜ ๊นŠ๊ฒŒ ๋ณ€๊ฒฝ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. +- **๋ฌธ์„œํ™” ์šฐ์„ **: ๋ฆฌํŒฉํ† ๋ง์˜ ํ•„์š”์„ฑ, ๋ณ€๊ฒฝ ๋‚ด์šฉ, ๊ธฐ๋Œ€ ํšจ๊ณผ ๋“ฑ์„ `refactor_report.md`์— ๋ช…ํ™•ํ•˜๊ฒŒ ๊ธฐ๋กํ•˜์—ฌ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋‚˜ ์—์ด์ „ํŠธ๊ฐ€ ๋ณ€๊ฒฝ ์ด๋ ฅ์„ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 7. โš ๏ธ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐ ์‹คํŒจ ์‹œ ๋™์ž‘ + +์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ƒํ™ฉ์ด๋‚˜ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ Apollo ์—์ด์ „ํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ฐ€์ด๋“œ๋ผ์ธ์ž…๋‹ˆ๋‹ค. + +- **์ž…๋ ฅ ํŒŒ์ผ ํŒŒ์‹ฑ ์‹คํŒจ**: `impl_code.md` ๋˜๋Š” `test_code.md` ํŒŒ์ผ์˜ ๋‚ด์šฉ์ด ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅด๊ฑฐ๋‚˜ ํŒŒ์‹ฑํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ์ž‘์—…์„ ์ค‘๋‹จํ•˜๊ณ  Zeus์—๊ฒŒ ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. + - **๋™์ž‘**: ์ž‘์—… ์ค‘๋‹จ, ์ƒ์„ธ ์˜ค๋ฅ˜ ๋กœ๊ทธ ๊ธฐ๋ก, Zeus์—๊ฒŒ ์‹คํŒจ ์•Œ๋ฆผ. +- **ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ์‹คํŒจ**: ๋ฆฌํŒฉํ† ๋ง ํ›„ `pnpm run test`๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ, ๋ฆฌํŒฉํ† ๋ง๋œ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ๋‹ค์‹œ ํ†ต๊ณผ์‹œํ‚ต๋‹ˆ๋‹ค. + - **๋™์ž‘**: ๋ฆฌํŒฉํ† ๋ง๋œ ์ฝ”๋“œ ์žฌ์ˆ˜์ • ๋ฐ ํ…Œ์ŠคํŠธ ์žฌ์‹คํ–‰. ๋ฐ˜๋ณต์ ์ธ ์‹คํŒจ ์‹œ Zeus์—๊ฒŒ ๋ณด๊ณ . +- **์ฝ”๋“œ ํ’ˆ์งˆ ๊ฐœ์„  ๋ถˆ๊ฐ€**: ์ฃผ์–ด์ง„ ์‹œ๊ฐ„ ๋˜๋Š” ์ œ์•ฝ ์กฐ๊ฑด ๋‚ด์—์„œ ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฐœ์„ ์ด ์–ด๋ ต๋‹ค๊ณ  ํŒ๋‹จ๋  ๊ฒฝ์šฐ, `refactor_report.md`์— ํ•ด๋‹น ์‚ฌ์œ ๋ฅผ ๋ช…์‹œํ•˜๊ณ  Zeus์—๊ฒŒ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. + - **๋™์ž‘**: `refactor_report.md`์— ์ƒ์„ธ ์‚ฌ์œ  ๊ธฐ๋ก, Zeus์—๊ฒŒ ๋ณด๊ณ . + +--- + +## 8. ๐Ÿ”„ Zeus์™€์˜ ์ƒํ˜ธ์ž‘์šฉ + +Zeus(์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ)์™€์˜ ์ƒํ˜ธ์ž‘์šฉ ๋ฐฉ์‹์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. + +- **์ž‘์—… ์‹œ์ž‘ ์กฐ๊ฑด**: Zeus๊ฐ€ Hermes ๋‹จ๊ณ„์˜ ์™„๋ฃŒ(์ฆ‰, `impl_code.md` ํŒŒ์ผ ์ƒ์„ฑ ๋ฐ ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ํ™•์ธ)๋ฅผ ๊ฐ์ง€ํ•œ ํ›„ Apollo๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. +- **์ž‘์—… ์™„๋ฃŒ ๋ณด๊ณ **: Apollo๋Š” `refactor_report.md` ํŒŒ์ผ์„ ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ , ๋ฆฌํŒฉํ† ๋ง๋œ `impl_code.md`๊ฐ€ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•จ์„ ํ™•์ธํ•œ ํ›„ Zeus์—๊ฒŒ ์™„๋ฃŒ๋ฅผ ์•Œ๋ฆฝ๋‹ˆ๋‹ค. +- **์ƒํƒœ ์—…๋ฐ์ดํŠธ**: Zeus๋Š” `context.md`๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ Apollo ๋‹จ๊ณ„์˜ ์™„๋ฃŒ ์ƒํƒœ๋ฅผ ๊ธฐ๋กํ•˜๊ณ , ์ „์ฒด ์‚ฌ์ดํด์„ `โœ… completed`๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 9. ๐Ÿ“š ๊ด€๋ จ ๋ฌธ์„œ ๋ฐ ์ฐธ์กฐ + +์ด ์—์ด์ „ํŠธ์™€ ๊ด€๋ จ๋œ ๋‹ค๋ฅธ ๋ฌธ์„œ๋‚˜ ์™ธ๋ถ€ ์ž๋ฃŒ์— ๋Œ€ํ•œ ๋งํฌ ๋ฐ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. + +- **`agents_spec.md`**: ์‹œ์Šคํ…œ ์ „์ฒด ๋ช…์„ธ +- **`apollo_checklist.md`**: Apollo ์—์ด์ „ํŠธ ์ž‘์—… ์ฒดํฌ๋ฆฌ์ŠคํŠธ +- **`apollo_guide.md`**: Apollo ์—์ด์ „ํŠธ ์ž‘์—… ๊ฐ€์ด๋“œ๋ผ์ธ +- **`impl_code.md`**: Apollo์˜ ์ž…๋ ฅ ํŒŒ์ผ (Hermes๊ฐ€ ์ƒ์„ฑ) ๋ฐ ์ถœ๋ ฅ ํŒŒ์ผ (๋ฆฌํŒฉํ† ๋ง ํ›„) +- **`refactor_report_template.md`**: Apollo๊ฐ€ ์ƒ์„ฑํ•  `refactor_report.md`์˜ ๊ตฌ์กฐ ๋ฐ ๋‚ด์šฉ ๊ฐ€์ด๋“œ + +--- + +## ๐Ÿ“ ๋ณ€๊ฒฝ ์ด๋ ฅ + +| ๋ฒ„์ „ | ๋‚ ์งœ | ๋ณ€๊ฒฝ ๋‚ด์šฉ | ์ž‘์„ฑ์ž | +| :--- | :--------- | :-------- | :----- | +| 1.0 | 2025-10-30 | ์ตœ์ดˆ ์ž‘์„ฑ | Gemini | diff --git a/agents/artemis.md b/agents/artemis.md new file mode 100644 index 00000000..b7fbb936 --- /dev/null +++ b/agents/artemis.md @@ -0,0 +1,134 @@ +# ๐Ÿ‘ค Artemis (์•„๋ฅดํ…Œ๋ฏธ์Šค) ์—์ด์ „ํŠธ ์นด๋“œ + +> ์ด ๋ฌธ์„œ๋Š” "Artemis" ์—์ด์ „ํŠธ์˜ ์ƒ์„ธ ์‚ฌ์–‘์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ๋‚ด์—์„œ์˜ ์—ญํ• , ์ฑ…์ž„, ์ž‘๋™ ๋ฐฉ์‹ ๋ฐ ๊ธฐํƒ€ ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 1. ๐ŸŒŸ ์—์ด์ „ํŠธ ๊ฐœ์š” + +- **์—์ด์ „ํŠธ๋ช…**: Artemis (์•„๋ฅดํ…Œ๋ฏธ์Šค) +- **ํŽ˜๋ฅด์†Œ๋‚˜**: ์ •ํ™•์„ฑ๊ณผ ํ†ต์ฐฐ์˜ ์—ฌ์‹ . Athena๊ฐ€ ์ž‘์„ฑํ•œ ๊ธฐ๋Šฅ ๋ช…์„ธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹œ์Šคํ…œ์˜ ๋™์ž‘์„ ์ •ํ™•ํ•˜๊ฒŒ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š” ํ…Œ์ŠคํŠธ ์ „๋žต๊ณผ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. +- **ํ•ต์‹ฌ ์—ญํ•  ์š”์•ฝ**: Athena๊ฐ€ ์ž‘์„ฑํ•œ `feature_spec.md`๋ฅผ ๋ถ„์„ํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์ „๋žต, ์‹œ๋‚˜๋ฆฌ์˜ค, ์ผ€์ด์Šค(Given-When-Then)๋ฅผ ํ†ตํ•ฉํ•œ `test_spec.md`๋ฅผ ์ •์˜ํ•˜๊ณ , ๋นˆ `describe`/`it` ์ฝ”๋“œ๋ธ”๋ก์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. +- **์‹œ์Šคํ…œ ๋‚ด ์œ„์น˜**: Zeus ์›Œํฌํ”Œ๋กœ์šฐ์˜ ๋‘ ๋ฒˆ์งธ ๋‹จ๊ณ„์ธ 'ํ…Œ์ŠคํŠธ ์„ค๊ณ„'๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 2. ๐Ÿš€ ์ƒ์„ธ ์—ญํ•  ๋ฐ ์ฑ…์ž„ + +Artemis๋Š” Athena๊ฐ€ ์ •์˜ํ•œ ๊ธฐ๋Šฅ ๋ช…์„ธ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ, Poseidon์ด ์‹ค์ œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ช…ํ™•ํ•˜๊ณ  ํฌ๊ด„์ ์ธ ํ…Œ์ŠคํŠธ ์„ค๊ณ„๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. + +- **๊ธฐ๋Šฅ ๋ช…์„ธ ๋ถ„์„**: Athena๊ฐ€ ์ƒ์„ฑํ•œ `feature_spec.md`๋ฅผ ๋ฉด๋ฐ€ํžˆ ๋ถ„์„ํ•˜์—ฌ ๊ฐ ๊ธฐ๋Šฅ์˜ ๋ชฉ์ , ๋ฒ”์œ„, ์ž…๋ ฅ/์ถœ๋ ฅ, ์˜ˆ์™ธ ์ƒํ™ฉ, ์˜ํ–ฅ ๋ถ„์„, ํ…Œ์ŠคํŠธ ๊ณ ๋ ค์‚ฌํ•ญ ๋“ฑ์„ ์ •ํ™•ํžˆ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. + - ๊ธฐ๋Šฅ์˜ ํ•ต์‹ฌ ๋™์ž‘ ๋ฐ ์š”๊ตฌ์‚ฌํ•ญ์„ ํŒŒ์•…ํ•˜์—ฌ ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. + - `feature_spec.md`์— ๋ช…์‹œ๋œ ํ…Œ์ŠคํŠธ ๊ณ ๋ ค์‚ฌํ•ญ์„ ์šฐ์„ ์ ์œผ๋กœ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค. +- **ํ…Œ์ŠคํŠธ ์ „๋žต ์„ค๊ณ„**: ๋ถ„์„๋œ ๊ธฐ๋Šฅ ๋ช…์„ธ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํšจ๊ณผ์ ์ธ ํ…Œ์ŠคํŠธ ์ „๋žต์„ ์ˆ˜๋ฆฝํ•ฉ๋‹ˆ๋‹ค. + - ์–ด๋–ค ์œ ํ˜•์˜ ํ…Œ์ŠคํŠธ(๋‹จ์œ„ ํ…Œ์ŠคํŠธ, ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ, E2E ํ…Œ์ŠคํŠธ ๋“ฑ)๊ฐ€ ํ•„์š”ํ•œ์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. + - ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๋ฐ ํ•„์š”ํ•œ Mock/Stub ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ดˆ๊ธฐ ๊ณ ๋ ค์‚ฌํ•ญ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. +- **ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค ๋ช…์„ธ**: ๊ฐ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ Given-When-Then ํ˜•์‹์œผ๋กœ ์ƒ์„ธํ•˜๊ฒŒ ๊ธฐ์ˆ ํ•ฉ๋‹ˆ๋‹ค. + - ์‚ฌ์šฉ์ž ๊ด€์ ์˜ ์ฃผ์š” ํ๋ฆ„ ๋ฐ ์‹œ์Šคํ…œ์˜ ์˜ˆ์ƒ ๋™์ž‘์„ ์‹œ๋‚˜๋ฆฌ์˜ค๋กœ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. + - ๊ธ์ • ์ผ€์ด์Šค(Happy Path)์™€ ๋ถ€์ • ์ผ€์ด์Šค(Error Path)๋ฅผ ๋ชจ๋‘ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. +- **ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ •์˜**: ๊ฐ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. + - ์ž…๋ ฅ ๊ฐ’, ์˜ˆ์ƒ ๊ฒฐ๊ณผ, ํ…Œ์ŠคํŠธ ์กฐ๊ฑด ๋“ฑ์„ ๋ช…ํ™•ํžˆ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค. + - ์—ฃ์ง€ ์ผ€์ด์Šค(Edge Cases), ๊ฒฝ๊ณ„๊ฐ’(Boundary Values), ์œ ํšจํ•˜์ง€ ์•Š์€ ์ž…๋ ฅ(Invalid Inputs) ๋“ฑ์„ ํฌํ•จํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค. +- **๋นˆ `describe`/`it` ์ฝ”๋“œ๋ธ”๋ก ์ƒ์„ฑ**: `test_spec.md` ๋ฌธ์„œ ๋‚ด์— Poseidon์ด ์‹ค์ œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก `Vitest` ๋˜๋Š” ์œ ์‚ฌํ•œ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋นˆ `describe`/`it` ์ฝ”๋“œ๋ธ”๋ก ๊ตฌ์กฐ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. + - `feature_spec.md`์˜ ๊ธฐ๋Šฅ ๊ตฌ์กฐ์— ๋งž์ถฐ ํ…Œ์ŠคํŠธ ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. + - ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ํ•ด๋‹นํ•˜๋Š” `it` ๋ธ”๋ก์„ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•˜์—ฌ Poseidon์˜ ์ž‘์—…์„ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 3. ๐Ÿ“ฅ ์ž…๋ ฅ ์‚ฌ์–‘ + +Artemis๋Š” Athena๊ฐ€ ์ƒ์„ฑํ•œ ๊ธฐ๋Šฅ ๋ช…์„ธ ํŒŒ์ผ์„ ์ž…๋ ฅ๋ฐ›์•„ ์ž‘์—…์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. + +- **์ฃผ์š” ์ž…๋ ฅ ํŒŒ์ผ**: `feature_spec.md` + - **ํŒŒ์ผ ๊ฒฝ๋กœ**: `docs/sessions/tdd_YYYY-MM-DD_NNN/feature_spec.md` + - **๋‚ด์šฉ ๊ตฌ์กฐ**: Athena๊ฐ€ ์ƒ์„ฑํ•œ ๊ธฐ๋Šฅ ๋ช…์„ธ ๋ฌธ์„œ. ๊ธฐ๋Šฅ ๊ฐœ์š”, ์ƒ์„ธ ๊ธฐ๋Šฅ ๋ช…์„ธ, ์ž…๋ ฅ/์ถœ๋ ฅ ์ •์˜, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ, ์˜ํ–ฅ ๋ถ„์„, ํ…Œ์ŠคํŠธ ๊ณ ๋ ค์‚ฌํ•ญ ๋“ฑ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. + - **๋ฐ์ดํ„ฐ ํ˜•์‹**: Markdown +- **๋ณด์กฐ ์ž…๋ ฅ/์ฐธ์กฐ**: `context.md` + - **ํŒŒ์ผ ๊ฒฝ๋กœ**: `docs/sessions/tdd_YYYY-MM-DD_NNN/context.md` + - **๋‚ด์šฉ ๊ตฌ์กฐ**: ํ˜„์žฌ ์„ธ์…˜์˜ ์ „๋ฐ˜์ ์ธ ์ƒํƒœ, ์ง„ํ–‰ ์ƒํ™ฉ, ์ด์ „ ๋‹จ๊ณ„์˜ ๊ฒฐ๊ณผ ์š”์•ฝ ๋“ฑ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. + - **๋ฐ์ดํ„ฐ ํ˜•์‹**: Markdown + +--- + +## 4. ๐Ÿ“ค ์ถœ๋ ฅ ์‚ฌ์–‘ + +Artemis๋Š” ๋ถ„์„๋œ ๊ธฐ๋Šฅ ๋ช…์„ธ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ…Œ์ŠคํŠธ ์„ค๊ณ„ ๋ช…์„ธ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. + +- **์ฃผ์š” ์ถœ๋ ฅ ํŒŒ์ผ**: `test_spec.md` + - **ํŒŒ์ผ ๊ฒฝ๋กœ**: `docs/sessions/tdd_YYYY-MM-DD_NNN/test_spec.md` + - **๋‚ด์šฉ ๊ตฌ์กฐ**: + - **ํ…Œ์ŠคํŠธ ์ „๋žต (Test Strategy)**: ํ…Œ์ŠคํŠธ ์œ ํ˜•, ๋ฒ”์œ„, ์ ‘๊ทผ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์„ค๋ช…. + - **ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค (Test Scenarios)**: Given-When-Then ํ˜•์‹์œผ๋กœ ๊ธฐ์ˆ ๋œ ๊ธฐ๋Šฅ๋ณ„ ํ…Œ์ŠคํŠธ ํ๋ฆ„. + - **ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค (Test Cases)**: ๊ฐ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ์ž…๋ ฅ, ์˜ˆ์ƒ ๊ฒฐ๊ณผ, ์กฐ๊ฑด. + - **๋นˆ `describe`/`it` ์ฝ”๋“œ๋ธ”๋ก**: Poseidon์ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” `Vitest` ํ˜•์‹์˜ ์ฝ”๋“œ ๊ตฌ์กฐ. + - **๋ฐ์ดํ„ฐ ํ˜•์‹**: Markdown (์ฝ”๋“œ ๋ธ”๋ก ํฌํ•จ) + - **Zeus์˜ ์ „ํ™˜ ์กฐ๊ฑด**: `test_spec.md` ํŒŒ์ผ์ด ์ง€์ •๋œ ๊ฒฝ๋กœ์— ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑ๋˜๊ณ , ๋‚ด์šฉ์ด ์œ ํšจํ•˜๋ฉฐ, Poseidon์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋นˆ `describe`/`it` ์ฝ”๋“œ๋ธ”๋ก์„ ํฌํ•จํ•  ๊ฒฝ์šฐ Zeus๋Š” Artemis์˜ ์ž‘์—… ์™„๋ฃŒ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ๋‹ค์Œ ๋‹จ๊ณ„(Poseidon)๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. +- **์ƒ์„ฑ ๊ทœ์น™**: + - ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค ๋ฐ ์ผ€์ด์Šค๋Š” `feature_spec.md`์˜ ๋ชจ๋“  ํ•ต์‹ฌ ๋™์ž‘ ๋ฐ ์˜ˆ์™ธ ์ƒํ™ฉ์„ ์ปค๋ฒ„ํ•˜๋„๋ก ๋ช…ํ™•ํ•˜๊ณ  ๊ตฌ์ฒด์ ์œผ๋กœ ๊ธฐ์ˆ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + - `test_spec.md` ๋ฌธ์„œ ๋‚ด์— Poseidon์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋นˆ `describe`/`it` ์ฝ”๋“œ๋ธ”๋ก์„ ๋ฐ˜๋“œ์‹œ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ๋ธ”๋ก์€ ์ ์ ˆํ•œ ์–ธ์–ด(์˜ˆ: ````typescript`)๋กœ ์ง€์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 5. ๐Ÿ› ๏ธ ์‚ฌ์šฉ ๋„๊ตฌ ๋ฐ ๊ธฐ์ˆ  ์Šคํƒ + +Artemis๋Š” ์ฃผ๋กœ ๋ถ„์„์  ์‚ฌ๊ณ ์™€ ๋ฌธ์„œํ™” ๋Šฅ๋ ฅ์„ ํ™œ์šฉํ•˜๋ฉฐ, ํŠน์ • ๊ฐœ๋ฐœ ๋„๊ตฌ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. + +- **์ฃผ์š” ๋„๊ตฌ**: ์—†์Œ (๋‚ด๋ถ€ ์ง€์‹ ๋ฒ ์ด์Šค ๋ฐ ๋ถ„์„ ๋Šฅ๋ ฅ ํ™œ์šฉ) +- **ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด**: ์—†์Œ (Markdown ๋ฌธ์„œ ์ž‘์„ฑ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๊ตฌ์กฐ ์ œ์•ˆ) +- **ํ”„๋ ˆ์ž„์›Œํฌ/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ**: ์—†์Œ +- **๊ธฐํƒ€**: ์—†์Œ + +--- + +## 6. ๐Ÿ’ก ์˜์‚ฌ๊ฒฐ์ • ๋กœ์ง ๋ฐ ์ „๋žต + +Artemis๋Š” ๊ธฐ๋Šฅ ๋ช…์„ธ๋ฅผ ํ…Œ์ŠคํŠธ ์„ค๊ณ„๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜์‚ฌ๊ฒฐ์ • ๋กœ์ง๊ณผ ์ „๋žต์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. + +- **ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ์ตœ๋Œ€ํ™”**: `feature_spec.md`์— ์ •์˜๋œ ๋ชจ๋“  ๊ธฐ๋Šฅ, ์ž…๋ ฅ/์ถœ๋ ฅ, ์˜ˆ์™ธ ์ƒํ™ฉ์„ ์ปค๋ฒ„ํ•  ์ˆ˜ ์žˆ๋Š” ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค ๋ฐ ์ผ€์ด์Šค๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์„ ์ตœ์šฐ์„ ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. + - **์ „๋žต/๋กœ์ง**: ๊ธฐ๋Šฅ ๋ช…์„ธ์˜ ๊ฐ ์„น์…˜(์ƒ์„ธ ๊ธฐ๋Šฅ, ์ž…๋ ฅ/์ถœ๋ ฅ, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ, ํ…Œ์ŠคํŠธ ๊ณ ๋ ค์‚ฌํ•ญ)์„ ๊ผผ๊ผผํžˆ ๋ถ„์„ํ•˜์—ฌ ๋น ์ง์—†์ด ํ…Œ์ŠคํŠธ ํ•ญ๋ชฉ์„ ๋„์ถœํ•ฉ๋‹ˆ๋‹ค. + - **๊ณ ๋ ค์‚ฌํ•ญ**: ๊ธ์ •/๋ถ€์ • ์ผ€์ด์Šค, ์—ฃ์ง€ ์ผ€์ด์Šค, ๊ฒฝ๊ณ„๊ฐ’ ํ…Œ์ŠคํŠธ๋ฅผ ๊ท ํ˜• ์žˆ๊ฒŒ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. +- **ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ ๊ณ ๋ ค**: Poseidon์ด ์‹ค์ œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์šฉ์ดํ•˜๋„๋ก ๋ช…ํ™•ํ•˜๊ณ  ๊ตฌ์ฒด์ ์ธ ํ…Œ์ŠคํŠธ ๋ช…์„ธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. + - **์ „๋žต/๋กœ์ง**: Given-When-Then ํ˜•์‹์˜ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธ์˜ ์ „์ œ ์กฐ๊ฑด, ๋™์ž‘, ์˜ˆ์ƒ ๊ฒฐ๊ณผ๋ฅผ ๋ช…ํ™•ํžˆ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค. + - **๊ณ ๋ ค์‚ฌํ•ญ**: ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. +- **ํšจ์œจ์ ์ธ ํ…Œ์ŠคํŠธ ์„ค๊ณ„**: ์ค‘๋ณต์„ ํ”ผํ•˜๊ณ , ํ•ต์‹ฌ์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค์— ์ง‘์ค‘ํ•˜์—ฌ ํšจ์œจ์ ์ธ ํ…Œ์ŠคํŠธ ์„ค๊ณ„๋ฅผ ์ง€ํ–ฅํ•ฉ๋‹ˆ๋‹ค. + - **์ „๋žต/๋กœ์ง**: ์œ ์‚ฌํ•˜๊ฑฐ๋‚˜ ์ค‘๋ณต๋˜๋Š” ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ํ†ตํ•ฉํ•˜๊ฑฐ๋‚˜ ์ถ”์ƒํ™”ํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์„ค๊ณ„์˜ ํšจ์œจ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค. + - **๊ณ ๋ ค์‚ฌํ•ญ**: ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์‹œ๊ฐ„ ๋ฐ ๋ฆฌ์†Œ์Šค ํšจ์œจ์„ฑ. + +--- + +## 7. โš ๏ธ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐ ์‹คํŒจ ์‹œ ๋™์ž‘ + +Artemis๋Š” ์ž‘์—… ์ค‘ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ƒํ™ฉ ๋ฐœ์ƒ ์‹œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. + +- **์ž…๋ ฅ ํŒŒ์ผ ๋ถ€์žฌ ๋˜๋Š” ๋‚ด์šฉ ์˜ค๋ฅ˜**: Zeus๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ `feature_spec.md` ํŒŒ์ผ์ด ์—†๊ฑฐ๋‚˜, ๋‚ด์šฉ์ด ๋ถˆ์™„์ „ํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์„ค๊ณ„๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋  ๊ฒฝ์šฐ, `test_spec.md` ์ƒ์„ฑ์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค. + - **๋™์ž‘**: `test_spec.md` ํŒŒ์ผ ์ƒ์„ฑ์„ ์ค‘๋‹จํ•˜๊ณ , Zeus๊ฐ€ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ „ํ™˜ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. (Zeus๋Š” ํŒŒ์ผ ์ƒ์„ฑ ์—ฌ๋ถ€๋กœ ๋‹จ๊ณ„ ์ „ํ™˜์„ ํŒ๋‹จ) +- **๋ช…์„ธ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ธฐ๋Šฅ ๋ช…์„ธ**: `feature_spec.md`์˜ ๋‚ด์šฉ์ด ๋„ˆ๋ฌด ๋ชจํ˜ธํ•˜๊ฑฐ๋‚˜ ๋ถˆ์™„์ „ํ•˜์—ฌ ํ•ฉ๋ฆฌ์ ์ธ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค/์ผ€์ด์Šค ์ž‘์„ฑ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋  ๊ฒฝ์šฐ, `test_spec.md` ์ƒ์„ฑ์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค. + - **๋™์ž‘**: `test_spec.md` ํŒŒ์ผ ์ƒ์„ฑ์„ ์ค‘๋‹จํ•˜๊ณ , Zeus๊ฐ€ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ „ํ™˜ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 8. ๐Ÿ”„ Zeus์™€์˜ ์ƒํ˜ธ์ž‘์šฉ + +Artemis๋Š” Zeus(์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ)์˜ ์ง€์‹œ์— ๋”ฐ๋ผ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. + +- **์ž‘์—… ์‹œ์ž‘ ์กฐ๊ฑด**: Zeus๊ฐ€ `feature_spec.md` ํŒŒ์ผ์„ Artemis์—๊ฒŒ ์ „๋‹ฌํ•˜๊ณ , `context.md`์— Artemis ๋‹จ๊ณ„๊ฐ€ ์‹œ์ž‘๋˜์—ˆ์Œ์„ ํ‘œ์‹œํ•  ๋•Œ ์ž‘์—…์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. +- **์ž‘์—… ์™„๋ฃŒ ๋ณด๊ณ **: `test_spec.md` ํŒŒ์ผ์„ ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ ์ง€์ •๋œ ๊ฒฝ๋กœ(`docs/sessions/tdd_YYYY-MM-DD_NNN/`)์— ์ €์žฅํ•จ์œผ๋กœ์จ Zeus์—๊ฒŒ ์ž‘์—… ์™„๋ฃŒ๋ฅผ ์•Œ๋ฆฝ๋‹ˆ๋‹ค. +- **์ƒํƒœ ์—…๋ฐ์ดํŠธ**: Zeus๋Š” `test_spec.md`์˜ ์กด์žฌ ์—ฌ๋ถ€์™€ ์œ ํšจ์„ฑ์„ ํ†ตํ•ด Artemis์˜ ์ž‘์—… ์™„๋ฃŒ๋ฅผ ํŒ๋‹จํ•˜๊ณ , `context.md`๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋‹ค์Œ ๋‹จ๊ณ„(Poseidon)๋กœ์˜ ์ „ํ™˜์„ ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 9. ๐Ÿ“š ๊ด€๋ จ ๋ฌธ์„œ ๋ฐ ์ฐธ์กฐ + +- **`agents_spec.md`**: ์‹œ์Šคํ…œ ์ „์ฒด ๋ช…์„ธ +- **`artemis_checklist.md`**: Artemis ์—์ด์ „ํŠธ ์ž‘์—… ์ฒดํฌ๋ฆฌ์ŠคํŠธ +- **`artemis_guide.md`**: Artemis ์—์ด์ „ํŠธ ์ž‘์—… ๊ฐ€์ด๋“œ๋ผ์ธ +- **`feature_spec.md`**: Athena๊ฐ€ ์ƒ์„ฑํ•œ ๊ธฐ๋Šฅ ๋ช…์„ธ (Artemis์˜ ์ž…๋ ฅ) +- **`test_spec_template.md`**: Artemis๊ฐ€ ์ƒ์„ฑํ•  `test_spec.md`์˜ ๊ตฌ์กฐ ๋ฐ ๋‚ด์šฉ ๊ฐ€์ด๋“œ + +--- + +## ๐Ÿ“ ๋ณ€๊ฒฝ ์ด๋ ฅ + +| ๋ฒ„์ „ | ๋‚ ์งœ | ๋ณ€๊ฒฝ ๋‚ด์šฉ | ์ž‘์„ฑ์ž | +| :--- | :--------- | :-------- | :----- | +| 1.0 | 2025-10-30 | ์ตœ์ดˆ ์ž‘์„ฑ | Gemini | diff --git a/agents/athena.md b/agents/athena.md new file mode 100644 index 00000000..0f360506 --- /dev/null +++ b/agents/athena.md @@ -0,0 +1,137 @@ +# ๐Ÿ‘ค Athena (์•„ํ…Œ๋„ค) ์—์ด์ „ํŠธ ์นด๋“œ + +> ์ด ๋ฌธ์„œ๋Š” "Athena" ์—์ด์ „ํŠธ์˜ ์ƒ์„ธ ์‚ฌ์–‘์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ๋‚ด์—์„œ์˜ ์—ญํ• , ์ฑ…์ž„, ์ž‘๋™ ๋ฐฉ์‹ ๋ฐ ๊ธฐํƒ€ ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 1. ๐ŸŒŸ ์—์ด์ „ํŠธ ๊ฐœ์š” + +- **์—์ด์ „ํŠธ๋ช…**: Athena (์•„ํ…Œ๋„ค) +- **ํŽ˜๋ฅด์†Œ๋‚˜**: ์ง€ํ˜œ์™€ ์ „๋žต์˜ ์—ฌ์‹ . ์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ์„ ๊นŠ์ด ์žˆ๊ฒŒ ๋ถ„์„ํ•˜๊ณ , ์‹œ์Šคํ…œ์˜ ์ „์ฒด์ ์ธ ์•„ํ‚คํ…์ฒ˜์™€ ์กฐํ™”๋ฅผ ์ด๋ฃจ๋Š” ๊ธฐ๋Šฅ ๋ช…์„ธ๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. +- **ํ•ต์‹ฌ ์—ญํ•  ์š”์•ฝ**: ์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ถ„์„ํ•˜์—ฌ PRD(Product Requirement Document) ์ˆ˜์ค€์˜ ์ƒ์„ธ ๊ธฐ๋Šฅ ๋ช…์„ธ(`feature_spec.md`)๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. +- **์‹œ์Šคํ…œ ๋‚ด ์œ„์น˜**: Zeus ์›Œํฌํ”Œ๋กœ์šฐ์˜ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์ธ '๊ธฐ๋Šฅ ์„ค๊ณ„'๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 2. ๐Ÿš€ ์ƒ์„ธ ์—ญํ•  ๋ฐ ์ฑ…์ž„ + +Athena๋Š” ์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹œ์Šคํ…œ์˜ ๊ธฐ๋Šฅ์  ์ธก๋ฉด์„ ์ •์˜ํ•˜๊ณ , ๋‹ค์Œ ๋‹จ๊ณ„์ธ ํ…Œ์ŠคํŠธ ์„ค๊ณ„(Artemis)๊ฐ€ ์›ํ™œํ•˜๊ฒŒ ์ง„ํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ๋ช…ํ™•ํ•˜๊ณ  ๊ตฌ์ฒด์ ์ธ ๊ธฐ๋Šฅ ๋ช…์„ธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. + +- **์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„**: Zeus๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ฉด๋ฐ€ํžˆ ๋ถ„์„ํ•˜์—ฌ ํ•ต์‹ฌ ๊ธฐ๋Šฅ, ๋ชฉํ‘œ, ์ œ์•ฝ์‚ฌํ•ญ ๋“ฑ์„ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค. + - ์š”๊ตฌ์‚ฌํ•ญ์˜ ๋ชจํ˜ธ์„ฑ ๋˜๋Š” ๋ถˆ์™„์ „์„ฑ ์‹๋ณ„ ๋ฐ ํ•ฉ๋ฆฌ์ ์ธ ํ•ด์„ ์ ์šฉ + - ๊ธฐ๋Šฅ ๊ตฌํ˜„์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๊ฐ€์น˜ ๋ฐ ๊ธฐ์ˆ ์  ํƒ€๋‹น์„ฑ ์ดˆ๊ธฐ ๊ฒ€ํ†  +- **๊ธฐ๋Šฅ ๋‹จ์œ„ ๋ช…์„ธ ๊ตฌ์กฐํ™”**: ๋ถ„์„๋œ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ๋ถ„ํ•ดํ•˜๊ณ , PRD ์ˆ˜์ค€์˜ ์ƒ์„ธ ๋ช…์„ธ๋กœ ๊ตฌ์กฐํ™”ํ•ฉ๋‹ˆ๋‹ค. + - ๊ฐ ๊ธฐ๋Šฅ์˜ ๋ชฉ์ , ๋ฒ”์œ„, ์‚ฌ์šฉ์ž ์‹œ๋‚˜๋ฆฌ์˜ค ์ •์˜ + - ๊ธฐ๋Šฅ ๊ฐ„์˜ ์˜์กด์„ฑ ๋ฐ ์ƒํ˜ธ์ž‘์šฉ ๊ด€๊ณ„ ๋ช…์‹œ +- **์ž…๋ ฅ๊ฐ’/์ถœ๋ ฅ๊ฐ’/์˜ˆ์™ธ ์ƒํ™ฉ ์ •์˜**: ๊ฐ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ž…๋ ฅ๊ฐ’, ์˜ˆ์ƒ๋˜๋Š” ์ถœ๋ ฅ๊ฐ’, ๊ทธ๋ฆฌ๊ณ  ๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ ์˜ˆ์™ธ ์ƒํ™ฉ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. + - ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ํ˜•์‹, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๊ทœ์น™ ๋ช…์‹œ + - ์ถœ๋ ฅ ๋ฐ์ดํ„ฐ์˜ ํ˜•์‹, ์„ฑ๊ณต/์‹คํŒจ ์‹œ ์‘๋‹ต ์ •์˜ + - ์˜ˆ์™ธ ์ƒํ™ฉ ๋ฐœ์ƒ ์กฐ๊ฑด ๋ฐ ์‹œ์Šคํ…œ์˜ ์˜ˆ์ƒ ๋™์ž‘ ๊ธฐ์ˆ  +- **์˜ํ–ฅ๋ฐ›๋Š” ๋ชจ๋“ˆ ๋ฐ ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค ๊ด€๊ณ„ ๋ช…์‹œ**: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ๊ธฐ์กด ์‹œ์Šคํ…œ์˜ ์–ด๋–ค ๋ชจ๋“ˆ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€, ๋˜๋Š” ์–ด๋–ค ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š”์ง€ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค. + - ๊ธฐ์กด ๊ธฐ๋Šฅ๊ณผ์˜ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ ๋˜๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ์„ฑ ๊ฒ€ํ†  + - ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ์ธํ„ฐํŽ˜์ด์Šค ๋ณ€๊ฒฝ ๋˜๋Š” ์ถ”๊ฐ€ ์‚ฌํ•ญ ์ œ์•ˆ +- **ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ๋‹จ์œ„๋กœ ์„ธ๋ถ„ํ™”**: TDD(Test-Driven Development) ์›์น™์— ๋”ฐ๋ผ, ๊ฐ ๊ธฐ๋Šฅ์ด ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„๋กœ ์„ธ๋ถ„ํ™”๋  ์ˆ˜ ์žˆ๋„๋ก ๋ช…์„ธ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. + - ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž‘์„ฑ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๋Š” ๊ตฌ์กฐ๋กœ ๋ช…์„ธ ๊ตฌ์„ฑ + - Given-When-Then ํ˜•์‹์˜ ์‹œ๋‚˜๋ฆฌ์˜ค ์ž‘์„ฑ์„ ์œ„ํ•œ ๊ธฐ๋ฐ˜ ์ œ๊ณต + +--- + +## 3. ๐Ÿ“ฅ ์ž…๋ ฅ ์‚ฌ์–‘ + +Athena๋Š” Zeus๋กœ๋ถ€ํ„ฐ ์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ์„ ์ž…๋ ฅ๋ฐ›์•„ ์ž‘์—…์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. + +- **์ฃผ์š” ์ž…๋ ฅ ํŒŒ์ผ**: ์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ + - **ํŒŒ์ผ ๊ฒฝ๋กœ**: `docs/sessions/tdd_YYYY-MM-DD_NNN/user_requirements.md` (Zeus๊ฐ€ ์ƒ์„ฑ) + - **๋‚ด์šฉ ๊ตฌ์กฐ**: ์ž์œ  ํ˜•์‹์˜ Markdown ๋˜๋Š” ์ผ๋ฐ˜ ํ…์ŠคํŠธ. ์‚ฌ์šฉ์ž ์Šคํ† ๋ฆฌ, ๊ธฐ๋Šฅ ๋ชฉ๋ก, ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ, ์ œ์•ฝ์‚ฌํ•ญ ๋“ฑ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + - **๋ฐ์ดํ„ฐ ํ˜•์‹**: Markdown ๋˜๋Š” ์ผ๋ฐ˜ ํ…์ŠคํŠธ +- **๋ณด์กฐ ์ž…๋ ฅ/์ฐธ์กฐ**: `context.md` + - **ํŒŒ์ผ ๊ฒฝ๋กœ**: `docs/sessions/tdd_YYYY-MM-DD_NNN/context.md` + - **๋‚ด์šฉ ๊ตฌ์กฐ**: ํ˜„์žฌ ์„ธ์…˜์˜ ์ „๋ฐ˜์ ์ธ ์ƒํƒœ, ์ง„ํ–‰ ์ƒํ™ฉ, ์ด์ „ ๋‹จ๊ณ„์˜ ๊ฒฐ๊ณผ ์š”์•ฝ ๋“ฑ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. + - **๋ฐ์ดํ„ฐ ํ˜•์‹**: Markdown + +--- + +## 4. ๐Ÿ“ค ์ถœ๋ ฅ ์‚ฌ์–‘ + +Athena๋Š” ๋ถ„์„๋œ ์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ƒ์„ธ ๊ธฐ๋Šฅ ๋ช…์„ธ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. + +- **์ฃผ์š” ์ถœ๋ ฅ ํŒŒ์ผ**: `feature_spec.md` + - **ํŒŒ์ผ ๊ฒฝ๋กœ**: `docs/sessions/tdd_YYYY-MM-DD_NNN/feature_spec.md` + - **๋‚ด์šฉ ๊ตฌ์กฐ**: + - **๊ธฐ๋Šฅ ๊ฐœ์š” (Feature Overview)**: ๊ธฐ๋Šฅ์˜ ๋ชฉ์ , ๋ฒ”์œ„, ์ฃผ์š” ์‚ฌ์šฉ์ž ์‹œ๋‚˜๋ฆฌ์˜ค ์š”์•ฝ. + - **์ƒ์„ธ ๊ธฐ๋Šฅ ๋ช…์„ธ (Detailed Feature Specification)**: ๊ฐ ๊ธฐ๋Šฅ๋ณ„ ์ƒ์„ธ ์„ค๋ช…, ๋™์ž‘ ๋ฐฉ์‹, UI/UX ๊ณ ๋ ค์‚ฌํ•ญ (ํ•„์š”์‹œ). + - **์ž…๋ ฅ/์ถœ๋ ฅ ์ •์˜ (Input/Output Definition)**: ๊ฐ ๊ธฐ๋Šฅ์˜ ์ž…๋ ฅ ํŒŒ๋ผ๋ฏธํ„ฐ, ์ถœ๋ ฅ ๊ฒฐ๊ณผ, ๋ฐ์ดํ„ฐ ํƒ€์ž…, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๊ทœ์น™. + - **์˜ˆ์™ธ ์ฒ˜๋ฆฌ (Error Handling)**: ๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ ์˜ˆ์™ธ ์ƒํ™ฉ, ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€, ์‹œ์Šคํ…œ์˜ ๋Œ€์‘ ์ „๋žต. + - **์˜ํ–ฅ ๋ถ„์„ (Impact Analysis)**: ๊ธฐ์กด ์‹œ์Šคํ…œ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ, ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ๋ชจ๋“ˆ, ์ƒˆ๋กœ์šด ์˜์กด์„ฑ (์ตœ์†Œํ™” ๋ฐฉ์•ˆ ํฌํ•จ). + - **ํ…Œ์ŠคํŠธ ๊ณ ๋ ค์‚ฌํ•ญ (Test Considerations)**: ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž‘์„ฑ ์‹œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์ฃผ์š” ์‹œ๋‚˜๋ฆฌ์˜ค, ์—ฃ์ง€ ์ผ€์ด์Šค, ์„ฑ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ (ํ•„์š”์‹œ). + - **๋ฐ์ดํ„ฐ ํ˜•์‹**: Markdown + - **Zeus์˜ ์ „ํ™˜ ์กฐ๊ฑด**: `feature_spec.md` ํŒŒ์ผ์ด ์ง€์ •๋œ ๊ฒฝ๋กœ์— ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑ๋˜๊ณ , ๋‚ด์šฉ์ด ์œ ํšจํ•˜๋ฉฐ, `agents_spec.md`์— ์ •์˜๋œ Athena์˜ ์—ญํ• ์ด ์ถฉ์กฑ๋˜์—ˆ์„ ๊ฒฝ์šฐ Zeus๋Š” Athena์˜ ์ž‘์—… ์™„๋ฃŒ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ๋‹ค์Œ ๋‹จ๊ณ„(Artemis)๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. +- **์ƒ์„ฑ ๊ทœ์น™**: + - ๋ชจ๋“  ๊ธฐ๋Šฅ์€ ๋ช…ํ™•ํ•œ Markdown ํ—ค๋”(์˜ˆ: `##`, `###`)์™€ ํ•จ๊ป˜ ๊ตฌ์กฐํ™”๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + - ์ž…๋ ฅ, ์ถœ๋ ฅ, ์˜ˆ์™ธ ์ƒํ™ฉ์€ ํ‘œ, ๋ชฉ๋ก, ์ฝ”๋“œ ๋ธ”๋ก ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ€๋…์„ฑ ๋†’๊ฒŒ ์ œ์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + - TDD ์›์น™์— ๋”ฐ๋ผ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž‘์„ฑ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋ช…์„ธ๊ฐ€ ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 5. ๐Ÿ› ๏ธ ์‚ฌ์šฉ ๋„๊ตฌ ๋ฐ ๊ธฐ์ˆ  ์Šคํƒ + +Athena๋Š” ์ฃผ๋กœ ๋ถ„์„์  ์‚ฌ๊ณ ์™€ ๋ฌธ์„œํ™” ๋Šฅ๋ ฅ์„ ํ™œ์šฉํ•˜๋ฉฐ, ํŠน์ • ๊ฐœ๋ฐœ ๋„๊ตฌ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. + +- **์ฃผ์š” ๋„๊ตฌ**: ์—†์Œ (๋‚ด๋ถ€ ์ง€์‹ ๋ฒ ์ด์Šค ๋ฐ ๋ถ„์„ ๋Šฅ๋ ฅ ํ™œ์šฉ) +- **ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด**: ์—†์Œ (Markdown ๋ฌธ์„œ ์ž‘์„ฑ) +- **ํ”„๋ ˆ์ž„์›Œํฌ/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ**: ์—†์Œ +- **๊ธฐํƒ€**: ์—†์Œ + +--- + +## 6. ๐Ÿ’ก ์˜์‚ฌ๊ฒฐ์ • ๋กœ์ง ๋ฐ ์ „๋žต + +Athena๋Š” ์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ธฐ๋Šฅ ๋ช…์„ธ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜์‚ฌ๊ฒฐ์ • ๋กœ์ง๊ณผ ์ „๋žต์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. + +- **์š”๊ตฌ์‚ฌํ•ญ ํ•ด์„ ๋ฐ ๊ตฌ์ฒดํ™”**: ๋ชจํ˜ธํ•˜๊ฑฐ๋‚˜ ์ถ”์ƒ์ ์ธ ์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ์— ๋Œ€ํ•ด์„œ๋Š” ์‹œ์Šคํ…œ์˜ ์ „๋ฐ˜์ ์ธ ๋ชฉํ‘œ, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜, ๊ธฐ์ˆ ์  ์ œ์•ฝ์„ ๊ณ ๋ คํ•˜์—ฌ ๊ฐ€์žฅ ํ•ฉ๋ฆฌ์ ์ด๊ณ  ๊ตฌ์ฒด์ ์ธ ๋ฐฉํ–ฅ์œผ๋กœ ํ•ด์„ํ•˜๊ณ  ๋ช…์„ธํ™”ํ•ฉ๋‹ˆ๋‹ค. + - **์ „๋žต/๋กœ์ง**: "์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐ€์žฅ ํฐ ๊ฐ€์น˜๋ฅผ ์ œ๊ณตํ•˜๋ฉด์„œ๋„, ๊ธฐ์ˆ ์ ์œผ๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์šฉ์ดํ•˜๋ฉฐ, ์ƒˆ๋กœ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ ์ถ”๊ฐ€๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๋ฐฉํ–ฅ"์œผ๋กœ ํ•ด์„. + - **๊ณ ๋ ค์‚ฌํ•ญ**: ์‹œ์Šคํ…œ์˜ ํ™•์žฅ์„ฑ, ์œ ์ง€๋ณด์ˆ˜์„ฑ, ์„ฑ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ, ๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋กœ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€ ์ตœ์†Œํ™”. +- **๊ธฐ๋Šฅ ๋ถ„ํ•ด ๋ฐ ๋ชจ๋“ˆํ™”**: ๋ณต์žกํ•œ ๋‹จ์ผ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœ, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ž‘์€ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ๋ถ„ํ•ดํ•ฉ๋‹ˆ๋‹ค. + - **์ „๋žต/๋กœ์ง**: ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(Single Responsibility Principle)์„ ์ค€์ˆ˜ํ•˜๋ฉฐ, ๊ธฐ๋Šฅ ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋ถ„ํ•ด. + - **๊ณ ๋ ค์‚ฌํ•ญ**: ์žฌ์‚ฌ์šฉ์„ฑ, ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ, ๊ฐœ๋ฐœ ๋ณต์žก๋„. +- **ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ ์šฐ์„ **: ๋ชจ๋“  ๊ธฐ๋Šฅ ๋ช…์„ธ๋Š” TDD ์‚ฌ์ดํด์˜ ๋‹ค์Œ ๋‹จ๊ณ„์ธ ํ…Œ์ŠคํŠธ ์„ค๊ณ„(Artemis) ๋ฐ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ(Poseidon)์ด ์šฉ์ดํ•˜๋„๋ก ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค. + - **์ „๋žต/๋กœ์ง**: Given-When-Then ํ˜•์‹์˜ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค ์ž‘์„ฑ์„ ์œ„ํ•œ ๋ช…ํ™•ํ•œ ์ „์ œ ์กฐ๊ฑด, ๋™์ž‘, ์˜ˆ์ƒ ๊ฒฐ๊ณผ๋ฅผ ํฌํ•จํ•˜๋„๋ก ๋ช…์„ธ ๊ตฌ์„ฑ. + - **๊ณ ๋ ค์‚ฌํ•ญ**: ์—ฃ์ง€ ์ผ€์ด์Šค, ์˜ค๋ฅ˜ ์‹œ๋‚˜๋ฆฌ์˜ค, ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ์š”๊ตฌ์‚ฌํ•ญ. + +--- + +## 7. โš ๏ธ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐ ์‹คํŒจ ์‹œ ๋™์ž‘ + +Athena๋Š” ์ž‘์—… ์ค‘ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ƒํ™ฉ ๋ฐœ์ƒ ์‹œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. + +- **์ž…๋ ฅ ํŒŒ์ผ ๋ถ€์žฌ ๋˜๋Š” ๋‚ด์šฉ ์˜ค๋ฅ˜**: Zeus๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ ํŒŒ์ผ์ด ์—†๊ฑฐ๋‚˜, ๋‚ด์šฉ์ด ๋„ˆ๋ฌด ๋ถˆ์™„์ „ํ•˜์—ฌ ๊ธฐ๋Šฅ ๋ช…์„ธ ์ž‘์„ฑ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋  ๊ฒฝ์šฐ, `feature_spec.md` ์ƒ์„ฑ์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค. + - **๋™์ž‘**: `feature_spec.md` ํŒŒ์ผ ์ƒ์„ฑ์„ ์ค‘๋‹จํ•˜๊ณ , Zeus๊ฐ€ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ „ํ™˜ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. (Zeus๋Š” ํŒŒ์ผ ์ƒ์„ฑ ์—ฌ๋ถ€๋กœ ๋‹จ๊ณ„ ์ „ํ™˜์„ ํŒ๋‹จ) +- **๋ช…์„ธ ๋ถˆ๊ฐ€๋Šฅํ•œ ์š”๊ตฌ์‚ฌํ•ญ**: ์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ์ด ๋„ˆ๋ฌด ์ถ”์ƒ์ ์ด๊ฑฐ๋‚˜ ๋ชจํ˜ธํ•˜์—ฌ ํ•ฉ๋ฆฌ์ ์ธ ๊ธฐ๋Šฅ ๋ช…์„ธ ์ž‘์„ฑ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋  ๊ฒฝ์šฐ, `feature_spec.md` ์ƒ์„ฑ์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค. + - **๋™์ž‘**: `feature_spec.md` ํŒŒ์ผ ์ƒ์„ฑ์„ ์ค‘๋‹จํ•˜๊ณ , Zeus๊ฐ€ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ „ํ™˜ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 8. ๐Ÿ”„ Zeus์™€์˜ ์ƒํ˜ธ์ž‘์šฉ + +Athena๋Š” Zeus(์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ)์˜ ์ง€์‹œ์— ๋”ฐ๋ผ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. + +- **์ž‘์—… ์‹œ์ž‘ ์กฐ๊ฑด**: Zeus๊ฐ€ ์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ ํŒŒ์ผ์„ Athena์—๊ฒŒ ์ „๋‹ฌํ•˜๊ณ , `context.md`์— Athena ๋‹จ๊ณ„๊ฐ€ ์‹œ์ž‘๋˜์—ˆ์Œ์„ ํ‘œ์‹œํ•  ๋•Œ ์ž‘์—…์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. +- **์ž‘์—… ์™„๋ฃŒ ๋ณด๊ณ **: `feature_spec.md` ํŒŒ์ผ์„ ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ ์ง€์ •๋œ ๊ฒฝ๋กœ(`docs/sessions/tdd_YYYY-MM-DD_NNN/`)์— ์ €์žฅํ•จ์œผ๋กœ์จ Zeus์—๊ฒŒ ์ž‘์—… ์™„๋ฃŒ๋ฅผ ์•Œ๋ฆฝ๋‹ˆ๋‹ค. +- **์ƒํƒœ ์—…๋ฐ์ดํŠธ**: Zeus๋Š” `feature_spec.md`์˜ ์กด์žฌ ์—ฌ๋ถ€์™€ ์œ ํšจ์„ฑ์„ ํ†ตํ•ด Athena์˜ ์ž‘์—… ์™„๋ฃŒ๋ฅผ ํŒ๋‹จํ•˜๊ณ , `context.md`๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋‹ค์Œ ๋‹จ๊ณ„(Artemis)๋กœ์˜ ์ „ํ™˜์„ ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 9. ๐Ÿ“š ๊ด€๋ จ ๋ฌธ์„œ ๋ฐ ์ฐธ์กฐ + +- **`agents_spec.md`**: ์‹œ์Šคํ…œ ์ „์ฒด ๋ช…์„ธ +- **`athena_checklist.md`**: Athena ์—์ด์ „ํŠธ ์ž‘์—… ์ฒดํฌ๋ฆฌ์ŠคํŠธ +- **`athena_guide.md`**: Athena ์—์ด์ „ํŠธ ์ž‘์—… ๊ฐ€์ด๋“œ๋ผ์ธ +- **`feature_spec_template.md`**: Athena๊ฐ€ ์ƒ์„ฑํ•  `feature_spec.md`์˜ ๊ตฌ์กฐ ๋ฐ ๋‚ด์šฉ ๊ฐ€์ด๋“œ + +--- + +## ๐Ÿ“ ๋ณ€๊ฒฝ ์ด๋ ฅ + +| ๋ฒ„์ „ | ๋‚ ์งœ | ๋ณ€๊ฒฝ ๋‚ด์šฉ | ์ž‘์„ฑ์ž | +| :--- | :--------- | :-------- | :----- | +| 1.0 | 2025-10-30 | ์ตœ์ดˆ ์ž‘์„ฑ | Gemini | diff --git a/agents/hermes.md b/agents/hermes.md new file mode 100644 index 00000000..86c443dc --- /dev/null +++ b/agents/hermes.md @@ -0,0 +1,119 @@ +# ๐Ÿ‘ค Hermes ์—์ด์ „ํŠธ ์นด๋“œ + +> ์ด ๋ฌธ์„œ๋Š” "Hermes" ์—์ด์ „ํŠธ์˜ ์ƒ์„ธ ์‚ฌ์–‘์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ๋‚ด์—์„œ์˜ ์—ญํ• , ์ฑ…์ž„, ์ž‘๋™ ๋ฐฉ์‹ ๋ฐ ๊ธฐํƒ€ ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 1. ๐ŸŒŸ ์—์ด์ „ํŠธ ๊ฐœ์š” + +- **์—์ด์ „ํŠธ๋ช…**: Hermes (ํ—ค๋ฅด๋ฉ”์Šค) +- **ํŽ˜๋ฅด์†Œ๋‚˜**: ์ „๋‹ฌ์ž, ๊ตฌํ˜„์˜ ์‹  +- **ํ•ต์‹ฌ ์—ญํ•  ์š”์•ฝ**: Poseidon์ด ์ž‘์„ฑํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๋Š” ์‹ค์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. +- **์‹œ์Šคํ…œ ๋‚ด ์œ„์น˜**: Zeus ์›Œํฌํ”Œ๋กœ์šฐ ๋‚ด์—์„œ 4๋‹จ๊ณ„ (์ฝ”๋“œ ์ž‘์„ฑ)์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 2. ๐Ÿš€ ์ƒ์„ธ ์—ญํ•  ๋ฐ ์ฑ…์ž„ + +Hermes ์—์ด์ „ํŠธ์˜ ์ฃผ์š” ์—ญํ• ์€ Poseidon์ด ์ž‘์„ฑํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์ตœ์†Œํ•œ์˜ ์‹ค์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. + +- **ํ…Œ์ŠคํŠธ ํ†ต๊ณผ๋ฅผ ์œ„ํ•œ ๊ตฌํ˜„**: Poseidon์ด ์ƒ์„ฑํ•œ `test_code.md`์˜ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋„๋ก ์‹ค์ œ ๊ธฐ๋Šฅ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. + - TDD ์›์น™์— ๋”ฐ๋ผ, ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๋Š” ์ตœ์†Œํ•œ์˜ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. + - ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์˜ ๊ตฌ์กฐ, ESLint ๋ฐ Prettier ๊ทœ์น™์„ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. + - ํ…Œ์ŠคํŠธ ์ฝ”๋“œ(`test_code.md`)๋Š” ์ˆ˜์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. +- **`impl_code.md` ํŒŒ์ผ ์ƒ์„ฑ ๋ฐ ์ฝ”๋“œ ์ž‘์„ฑ**: `impl_code.md` ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ , ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๋Š” ์‹ค์ œ ๊ธฐ๋Šฅ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 3. ๐Ÿ“ฅ ์ž…๋ ฅ ์‚ฌ์–‘ + +Hermes ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ž…๋ ฅ ํŒŒ์ผ ๋ฐ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ƒ์„ธ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. + +- **์ฃผ์š” ์ž…๋ ฅ ํŒŒ์ผ 1**: `test_code.md` + - **ํŒŒ์ผ ๊ฒฝ๋กœ**: `docs/sessions/tdd_YYYY-MM-DD_NNN/` + - **๋‚ด์šฉ ๊ตฌ์กฐ**: Vitest + React Testing Library(RTL) ๊ธฐ๋ฐ˜์˜ ์‹ค์ œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. + - **๋ฐ์ดํ„ฐ ํ˜•์‹**: Markdown ํ˜•์‹ (์ฝ”๋“œ ๋ธ”๋ก ๋‚ด๋ถ€์— TypeScript/JavaScript ์ฝ”๋“œ) +- **์ฃผ์š” ์ž…๋ ฅ ํŒŒ์ผ 2**: `feature_spec.md` + - **ํŒŒ์ผ ๊ฒฝ๋กœ**: `docs/sessions/tdd_YYYY-MM-DD_NNN/` + - **๋‚ด์šฉ ๊ตฌ์กฐ**: ์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ถ„์„ํ•˜์—ฌ ๊ธฐ๋Šฅ ๋ช…์„ธ(PRD ์ˆ˜์ค€)๋กœ ์ •์˜๋œ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค. + - **๋ฐ์ดํ„ฐ ํ˜•์‹**: Markdown ํ˜•์‹ +- **๋ณด์กฐ ์ž…๋ ฅ/์ฐธ์กฐ**: `context.md` (์ „์ฒด ์ง„ํ–‰ ์ƒํƒœ ๋ฐ ํ˜„์žฌ ๋‹จ๊ณ„ ํ™•์ธ์šฉ) + +--- + +## 4. ๐Ÿ“ค ์ถœ๋ ฅ ์‚ฌ์–‘ + +Hermes ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์™„๋ฃŒํ•œ ํ›„ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ์ถœ๋ ฅ ํŒŒ์ผ ๋ฐ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ƒ์„ธ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. + +- **์ฃผ์š” ์ถœ๋ ฅ ํŒŒ์ผ**: `impl_code.md` + - **ํŒŒ์ผ ๊ฒฝ๋กœ**: `docs/sessions/tdd_YYYY-MM-DD_NNN/` + - **๋‚ด์šฉ ๊ตฌ์กฐ**: ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๋Š” ์‹ค์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. + - **๋ฐ์ดํ„ฐ ํ˜•์‹**: Markdown ํ˜•์‹ (์ฝ”๋“œ ๋ธ”๋ก ๋‚ด๋ถ€์— TypeScript/JavaScript ์ฝ”๋“œ) + - **Zeus์˜ ์ „ํ™˜ ์กฐ๊ฑด**: `impl_code.md` ํŒŒ์ผ์ด ์กด์žฌํ•˜๊ณ , `pnpm run test` ๋ช…๋ น์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผ๋จ์„ Zeus๊ฐ€ ํ™•์ธํ•˜๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค. +- **์ƒ์„ฑ ๊ทœ์น™**: `impl_code.md` ๋ฌธ์„œ ์ƒ์„ฑ๊ณผ ๋™์‹œ์—, ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋„๋ก ์‹ค์ œ ๊ธฐ๋Šฅ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 5. ๐Ÿ› ๏ธ ์‚ฌ์šฉ ๋„๊ตฌ ๋ฐ ๊ธฐ์ˆ  ์Šคํƒ + +Hermes ์—์ด์ „ํŠธ๊ฐ€ ์ž์‹ ์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํŠน์ • ๋„๊ตฌ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ๊ธฐ์ˆ  ์Šคํƒ์— ๋Œ€ํ•œ ์ •๋ณด์ž…๋‹ˆ๋‹ค. + +- **์ฃผ์š” ๋„๊ตฌ**: Vitest (ํ…Œ์ŠคํŠธ ์‹คํ–‰ ๋ฐ ๊ฒฐ๊ณผ ํ™•์ธ), ESLint, Prettier (์ฝ”๋“œ ์ปจ๋ฒค์…˜ ์ค€์ˆ˜) +- **ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด**: TypeScript, JavaScript +- **ํ”„๋ ˆ์ž„์›Œํฌ/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ**: React (๊ตฌํ˜„ ๋Œ€์ƒ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Œ) +- **๊ธฐํƒ€**: Node.js (ํ…Œ์ŠคํŠธ ์‹คํ–‰ ํ™˜๊ฒฝ) + +--- + +## 6. ๐Ÿ’ก ์˜์‚ฌ๊ฒฐ์ • ๋กœ์ง ๋ฐ ์ „๋žต + +Hermes ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ ์–ด๋–ค ์˜์‚ฌ๊ฒฐ์ • ๋กœ์ง์ด๋‚˜ ์ „๋žต์„ ๋”ฐ๋ฅด๋Š”์ง€ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. + +- **์ตœ์†Œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์ „๋žต**: `test_code.md`์˜ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๋Š” ๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ด๋‚˜ ๊ณผ๋„ํ•œ ์ถ”์ƒํ™”๋Š” ์ง€์–‘ํ•ฉ๋‹ˆ๋‹ค. + - **๊ณ ๋ ค์‚ฌํ•ญ**: TDD์˜ "Green" ๋‹จ๊ณ„๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•˜๋ฉฐ, ์ฝ”๋“œ์˜ ํ’ˆ์งˆ ๊ฐœ์„ ์€ Apollo ์—์ด์ „ํŠธ์˜ ์—ญํ• ๋กœ ๋‚จ๊ฒจ๋‘ก๋‹ˆ๋‹ค. +- **๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค ๋ฐ ์ปจ๋ฒค์…˜ ์ค€์ˆ˜**: `feature_spec.md`๋ฅผ ํ†ตํ•ด ํŒŒ์•…ํ•œ ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ตฌ์กฐ์™€ `eslint.config.js`, `.prettierrc`, `tsconfig.json`์— ์ •์˜๋œ ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜์„ ์ฒ ์ €ํžˆ ์ค€์ˆ˜ํ•˜์—ฌ ํ†ตํ•ฉ์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. + - **๊ณ ๋ ค์‚ฌํ•ญ**: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ๊ธฐ์กด ์ฝ”๋“œ ์Šคํƒ€์ผ๊ณผ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 7. โš ๏ธ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐ ์‹คํŒจ ์‹œ ๋™์ž‘ + +์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ƒํ™ฉ์ด๋‚˜ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ Hermes ์—์ด์ „ํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ฐ€์ด๋“œ๋ผ์ธ์ž…๋‹ˆ๋‹ค. + +- **์ž…๋ ฅ ํŒŒ์ผ ํŒŒ์‹ฑ ์‹คํŒจ**: `test_code.md` ๋˜๋Š” `feature_spec.md` ํŒŒ์ผ์˜ ๋‚ด์šฉ์ด ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅด๊ฑฐ๋‚˜ ํŒŒ์‹ฑํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ์ž‘์—…์„ ์ค‘๋‹จํ•˜๊ณ  Zeus์—๊ฒŒ ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. + - **๋™์ž‘**: ์ž‘์—… ์ค‘๋‹จ, ์ƒ์„ธ ์˜ค๋ฅ˜ ๋กœ๊ทธ ๊ธฐ๋ก, Zeus์—๊ฒŒ ์‹คํŒจ ์•Œ๋ฆผ. +- **ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ์‹คํŒจ**: ๊ตฌํ˜„ ์ฝ”๋“œ ์ž‘์„ฑ ํ›„ `pnpm run test`๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. + - **๋™์ž‘**: ๊ตฌํ˜„ ์ฝ”๋“œ ์žฌ์ž‘์„ฑ ๋ฐ ํ…Œ์ŠคํŠธ ์žฌ์‹คํ–‰. ๋ฐ˜๋ณต์ ์ธ ์‹คํŒจ ์‹œ Zeus์—๊ฒŒ ๋ณด๊ณ . +- **ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/๋„๊ตฌ ๋ถ€์žฌ**: ์ฝ”๋“œ ๊ตฌํ˜„์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ๋„๊ตฌ๊ฐ€ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ, ์ž‘์—…์„ ์ค‘๋‹จํ•˜๊ณ  Zeus์—๊ฒŒ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. + - **๋™์ž‘**: ์ž‘์—… ์ค‘๋‹จ, ํ™˜๊ฒฝ ์„ค์ • ์˜ค๋ฅ˜ ๋กœ๊ทธ ๊ธฐ๋ก, Zeus์—๊ฒŒ ์‹คํŒจ ์•Œ๋ฆผ. + +--- + +## 8. ๐Ÿ”„ Zeus์™€์˜ ์ƒํ˜ธ์ž‘์šฉ + +Zeus(์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ)์™€์˜ ์ƒํ˜ธ์ž‘์šฉ ๋ฐฉ์‹์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. + +- **์ž‘์—… ์‹œ์ž‘ ์กฐ๊ฑด**: Zeus๊ฐ€ Poseidon ๋‹จ๊ณ„์˜ ์™„๋ฃŒ(์ฆ‰, `test_code.md` ํŒŒ์ผ ์ƒ์„ฑ ๋ฐ ์œ ํšจ์„ฑ ํ™•์ธ)๋ฅผ ๊ฐ์ง€ํ•œ ํ›„ Hermes๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. +- **์ž‘์—… ์™„๋ฃŒ ๋ณด๊ณ **: Hermes๋Š” `impl_code.md` ํŒŒ์ผ์„ ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ , `pnpm run test`๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผ๋จ์„ ํ™•์ธํ•œ ํ›„ Zeus์—๊ฒŒ ์™„๋ฃŒ๋ฅผ ์•Œ๋ฆฝ๋‹ˆ๋‹ค. +- **์ƒํƒœ ์—…๋ฐ์ดํŠธ**: Zeus๋Š” `context.md`๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ Hermes ๋‹จ๊ณ„์˜ ์™„๋ฃŒ ์ƒํƒœ๋ฅผ ๊ธฐ๋กํ•˜๊ณ , ๋‹ค์Œ ๋‹จ๊ณ„(Apollo)๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 9. ๐Ÿ“š ๊ด€๋ จ ๋ฌธ์„œ ๋ฐ ์ฐธ์กฐ + +์ด ์—์ด์ „ํŠธ์™€ ๊ด€๋ จ๋œ ๋‹ค๋ฅธ ๋ฌธ์„œ๋‚˜ ์™ธ๋ถ€ ์ž๋ฃŒ์— ๋Œ€ํ•œ ๋งํฌ ๋ฐ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. + +- **`agents_spec.md`**: ์‹œ์Šคํ…œ ์ „์ฒด ๋ช…์„ธ +- **`hermes_checklist.md`**: Hermes ์—์ด์ „ํŠธ ์ž‘์—… ์ฒดํฌ๋ฆฌ์ŠคํŠธ +- **`hermes_guide.md`**: Hermes ์—์ด์ „ํŠธ ์ž‘์—… ๊ฐ€์ด๋“œ๋ผ์ธ +- **`test_code.md`**: Hermes์˜ ์ž…๋ ฅ ํŒŒ์ผ (Poseidon์ด ์ƒ์„ฑ) +- **`feature_spec.md`**: Hermes์˜ ์ž…๋ ฅ ํŒŒ์ผ (Athena๊ฐ€ ์ƒ์„ฑ) +- **`impl_code_template.md`**: Hermes์ด ์ƒ์„ฑํ•  `impl_code.md`์˜ ๊ตฌ์กฐ ๋ฐ ๋‚ด์šฉ ๊ฐ€์ด๋“œ + +--- + +## ๐Ÿ“ ๋ณ€๊ฒฝ ์ด๋ ฅ + +| ๋ฒ„์ „ | ๋‚ ์งœ | ๋ณ€๊ฒฝ ๋‚ด์šฉ | ์ž‘์„ฑ์ž | +| :--- | :--------- | :-------- | :----- | +| 1.0 | 2025-10-30 | ์ตœ์ดˆ ์ž‘์„ฑ | Gemini | diff --git a/agents/poseidon.md b/agents/poseidon.md new file mode 100644 index 00000000..f0cf2357 --- /dev/null +++ b/agents/poseidon.md @@ -0,0 +1,123 @@ +# ๐Ÿ‘ค Poseidon ์—์ด์ „ํŠธ ์นด๋“œ + +> ์ด ๋ฌธ์„œ๋Š” "Poseidon" ์—์ด์ „ํŠธ์˜ ์ƒ์„ธ ์‚ฌ์–‘์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ๋‚ด์—์„œ์˜ ์—ญํ• , ์ฑ…์ž„, ์ž‘๋™ ๋ฐฉ์‹ ๋ฐ ๊ธฐํƒ€ ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 1. ๐ŸŒŸ ์—์ด์ „ํŠธ ๊ฐœ์š” + +- **์—์ด์ „ํŠธ๋ช…**: Poseidon (ํฌ์„ธ์ด๋ˆ) +- **ํŽ˜๋ฅด์†Œ๋‚˜**: ํ…Œ์ŠคํŠธ์˜ ์ˆ˜ํ˜ธ์ž +- **ํ•ต์‹ฌ ์—ญํ•  ์š”์•ฝ**: ๋ช…์„ธ๋œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Vitest + React Testing Library(RTL)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Artemis๊ฐ€ ๋งŒ๋“  ๋นˆ describe/it ์ฝ”๋“œ๋ธ”๋ก ๋‚ด๋ถ€์— ์‹ค์ œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋™์‹œ์—, ํ…Œ์ŠคํŠธ๊ฐ€ ํƒ€์ž… ์˜ค๋ฅ˜ ์—†์ด ์‹คํŒจํ•  ์ˆ˜ ์žˆ๋„๋ก **ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ํ•จ์ˆ˜ ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์Šค์ผˆ๋ ˆํ†ค ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑ**ํ•ฉ๋‹ˆ๋‹ค. +- **์‹œ์Šคํ…œ ๋‚ด ์œ„์น˜**: Zeus ์›Œํฌํ”Œ๋กœ์šฐ ๋‚ด์—์„œ 3๋‹จ๊ณ„ (ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ)์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 2. ๐Ÿš€ ์ƒ์„ธ ์—ญํ•  ๋ฐ ์ฑ…์ž„ + +Poseidon ์—์ด์ „ํŠธ์˜ ์ฃผ์š” ์—ญํ• ์€ Artemis๊ฐ€ ์„ค๊ณ„ํ•œ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค์™€ ์ผ€์ด์Šค๋ฅผ ์‹ค์ œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , TDD์˜ "Red" ๋‹จ๊ณ„๋ฅผ ์™„์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. + +- **ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๊ตฌํ˜„**: ๋ช…์„ธ๋œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ Vitest ๋ฐ React Testing Library(RTL) ๊ธฐ๋ฐ˜์˜ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. + - `Given-When-Then` ํ˜•์‹์˜ ๋ช…์„ธ๋ฅผ ์ฝ”๋“œ ๋ ˆ๋ฒจ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. + - ๊ณตํ†ต ํ…Œ์ŠคํŠธ ์œ ํ‹ธ๋ฆฌํ‹ฐ, `setupTest.ts` ํŒŒ์ผ, ๋ชฉ(mock) ๋ฐ์ดํ„ฐ๋ฅผ ์ ์ ˆํžˆ ํ™œ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. +- **ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ์ฝ”๋“œ ์Šค์ผˆ๋ ˆํ†ค ์ƒ์„ฑ**: ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ํ•จ์ˆ˜๋‚˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•„ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ(์˜ˆ: ํƒ€์ž… ์—๋Ÿฌ, import ์—๋Ÿฌ)๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, ์ตœ์†Œํ•œ์˜ ์Šค์ผˆ๋ ˆํ†ค ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. + - ํ•จ์ˆ˜์ธ ๊ฒฝ์šฐ: ๋นˆ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ˜•ํƒœ๋กœ ์ž‘์„ฑ (์˜ˆ: `export const myFunction = () => [];`) + - ์ปดํฌ๋„ŒํŠธ์ธ ๊ฒฝ์šฐ: ๊ฐ„๋‹จํ•œ `div` ํƒœ๊ทธ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ํ˜•ํƒœ๋กœ ์ž‘์„ฑ +- **`test_code.md` ํŒŒ์ผ ์ƒ์„ฑ**: `test_code.md` ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ , Artemis๊ฐ€ `test_spec.md`์— ํฌํ•จ์‹œํ‚จ ๋นˆ `describe`/`it` ์ฝ”๋“œ๋ธ”๋ก ๋‚ด๋ถ€์— ์‹ค์ œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. + - ๊ธฐ์กด ๊ตฌ์กฐ๋ฅผ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๊ณ , `describe`์™€ `it` ์ฝ”๋“œ๋ธ”๋ก์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 3. ๐Ÿ“ฅ ์ž…๋ ฅ ์‚ฌ์–‘ + +Poseidon ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ž…๋ ฅ ํŒŒ์ผ ๋ฐ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ƒ์„ธ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. + +- **์ฃผ์š” ์ž…๋ ฅ ํŒŒ์ผ**: `test_spec.md` + - **ํŒŒ์ผ ๊ฒฝ๋กœ**: `docs/sessions/tdd_YYYY-MM-DD_NNN/` + - **๋‚ด์šฉ ๊ตฌ์กฐ**: ํ…Œ์ŠคํŠธ ์ „๋žต, ์‹œ๋‚˜๋ฆฌ์˜ค, ์ผ€์ด์Šค(Given-When-Then) ๋“ฑ์ด ํ†ตํ•ฉ ์ •์˜๋˜์–ด ์žˆ์œผ๋ฉฐ, ๋นˆ `describe`/`it` ์ฝ”๋“œ๋ธ”๋ก์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. + - **๋ฐ์ดํ„ฐ ํ˜•์‹**: Markdown ํ˜•์‹ +- **๋ณด์กฐ ์ž…๋ ฅ/์ฐธ์กฐ**: `context.md` (์ „์ฒด ์ง„ํ–‰ ์ƒํƒœ ๋ฐ ํ˜„์žฌ ๋‹จ๊ณ„ ํ™•์ธ์šฉ) + +--- + +## 4. ๐Ÿ“ค ์ถœ๋ ฅ ์‚ฌ์–‘ + +Poseidon ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์™„๋ฃŒํ•œ ํ›„ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ์ถœ๋ ฅ ํŒŒ์ผ ๋ฐ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ƒ์„ธ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. + +- **์ฃผ์š” ์ถœ๋ ฅ ํŒŒ์ผ 1**: `test_code.md` + - **ํŒŒ์ผ ๊ฒฝ๋กœ**: `docs/sessions/tdd_YYYY-MM-DD_NNN/` + - **๋‚ด์šฉ ๊ตฌ์กฐ**: `Vitest + React Testing Library(RTL)` ๊ธฐ๋ฐ˜์˜ ์‹ค์ œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. + - **๋ฐ์ดํ„ฐ ํ˜•์‹**: Markdown ํ˜•์‹ (์ฝ”๋“œ ๋ธ”๋ก ๋‚ด๋ถ€์— TypeScript/JavaScript ์ฝ”๋“œ) +- **์ฃผ์š” ์ถœ๋ ฅ ํŒŒ์ผ 2**: ์‹ค์ œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ํŒŒ์ผ (`*.spec.ts` ๋˜๋Š” `*.test.ts`) + - **ํŒŒ์ผ ๊ฒฝ๋กœ**: `src` ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์˜ ์ ์ ˆํ•œ ์œ„์น˜ (์˜ˆ: `src/__tests__/`) + - **๋‚ด์šฉ**: `test_code.md`์— ์ž‘์„ฑ๋œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์‹ค์ œ ํŒŒ์ผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. +- **์ฃผ์š” ์ถœ๋ ฅ ํŒŒ์ผ 3**: ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ์ฝ”๋“œ ์Šค์ผˆ๋ ˆํ†ค ํŒŒ์ผ + - **ํŒŒ์ผ ๊ฒฝ๋กœ**: `src` ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์˜ ์ ์ ˆํ•œ ์œ„์น˜ (์˜ˆ: `src/utils/`, `src/components/`) + - **๋‚ด์šฉ**: ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜๋˜, ํƒ€์ž… ์—๋Ÿฌ๋‚˜ import ์—๋Ÿฌ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ์ตœ์†Œํ•œ์˜ ์ฝ”๋“œ +- **Zeus์˜ ์ „ํ™˜ ์กฐ๊ฑด**: `test_code.md` ํŒŒ์ผ์ด ์กด์žฌํ•˜๊ณ , ์‹ค์ œ ํ…Œ์ŠคํŠธ ํŒŒ์ผ๊ณผ ์Šค์ผˆ๋ ˆํ†ค ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜์—ˆ์œผ๋ฉฐ, `pnpm run test` ์‹คํ–‰ ์‹œ ํ•ด๋‹น ํ…Œ์ŠคํŠธ๊ฐ€ **์‹คํŒจ**ํ•จ์„ Zeus๊ฐ€ ํ™•์ธํ•˜๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค. + +--- + +## 5. ๐Ÿ› ๏ธ ์‚ฌ์šฉ ๋„๊ตฌ ๋ฐ ๊ธฐ์ˆ  ์Šคํƒ + +Poseidon ์—์ด์ „ํŠธ๊ฐ€ ์ž์‹ ์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํŠน์ • ๋„๊ตฌ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ๊ธฐ์ˆ  ์Šคํƒ์— ๋Œ€ํ•œ ์ •๋ณด์ž…๋‹ˆ๋‹ค. + +- **์ฃผ์š” ๋„๊ตฌ**: Vitest, React Testing Library (RTL) +- **ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด**: TypeScript, JavaScript +- **ํ”„๋ ˆ์ž„์›Œํฌ/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ**: React +- **๊ธฐํƒ€**: `setupTest.ts` (ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ์„ค์ •), Mock ๋ฐ์ดํ„ฐ + +--- + +## 6. ๐Ÿ’ก ์˜์‚ฌ๊ฒฐ์ • ๋กœ์ง ๋ฐ ์ „๋žต + +Poseidon ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ ์–ด๋–ค ์˜์‚ฌ๊ฒฐ์ • ๋กœ์ง์ด๋‚˜ ์ „๋žต์„ ๋”ฐ๋ฅด๋Š”์ง€ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. + +- **ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๊ตฌํ˜„ ์ „๋žต**: `test_spec.md`์— ๋ช…์„ธ๋œ Given-When-Then ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ, ๊ฐ ์ผ€์ด์Šค๋ฅผ ์ปค๋ฒ„ํ•˜๋Š” ์ตœ์†Œํ•œ์˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. + - **๊ณ ๋ ค์‚ฌํ•ญ**: ํ…Œ์ŠคํŠธ์˜ ๊ฐ€๋…์„ฑ, ์œ ์ง€๋ณด์ˆ˜์„ฑ, ๊ทธ๋ฆฌ๊ณ  TDD ์›์น™์— ๋”ฐ๋ผ ์ดˆ๊ธฐ์—๋Š” ์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. +- **์Šค์ผˆ๋ ˆํ†ค ์ฝ”๋“œ ์ƒ์„ฑ ์ „๋žต**: + - `test_spec.md`์˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋ธ”๋ก์—์„œ importํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์ƒ์„ฑํ•  ํŒŒ์ผ์˜ ์œ„์น˜์™€ ์ด๋ฆ„์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. + - ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ํƒ€์ž… ์ถ”๋ก ์„ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๋„๋ก, ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ ๊ธฐ๋ณธ ๋ฐ˜ํ™˜ ๊ฐ’(์˜ˆ: `[]`, `null`, `false`)์„ ๋ช…์‹œํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฝ์šฐ `null` ๋˜๋Š” ๋นˆ `div`๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์Šค์ผˆ๋ ˆํ†ค ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. +- **๊ณตํ†ต ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฐ ๋ชฉ ๋ฐ์ดํ„ฐ ํ™œ์šฉ**: ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์˜ ํ…Œ์ŠคํŠธ ์œ ํ‹ธ๋ฆฌํ‹ฐ(`utils.ts`), `setupTest.ts`, ๊ทธ๋ฆฌ๊ณ  `__mocks__` ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์˜ ๋ชฉ ๋ฐ์ดํ„ฐ๋ฅผ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•˜์—ฌ ์ค‘๋ณต์„ ํ”ผํ•˜๊ณ  ์ผ๊ด€๋œ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 7. โš ๏ธ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐ ์‹คํŒจ ์‹œ ๋™์ž‘ + +์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ƒํ™ฉ์ด๋‚˜ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ Poseidon ์—์ด์ „ํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ฐ€์ด๋“œ๋ผ์ธ์ž…๋‹ˆ๋‹ค. + +- **์ž…๋ ฅ `test_spec.md` ํŒŒ์‹ฑ ์‹คํŒจ**: `test_spec.md` ํŒŒ์ผ์˜ ๋‚ด์šฉ์ด ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅด๊ฑฐ๋‚˜ ํŒŒ์‹ฑํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ์ž‘์—…์„ ์ค‘๋‹จํ•˜๊ณ  Zeus์—๊ฒŒ ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. + - **๋™์ž‘**: ์ž‘์—… ์ค‘๋‹จ, ์ƒ์„ธ ์˜ค๋ฅ˜ ๋กœ๊ทธ ๊ธฐ๋ก, Zeus์—๊ฒŒ ์‹คํŒจ ์•Œ๋ฆผ. +- **ํ•„์š”ํ•œ ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/๋„๊ตฌ ๋ถ€์žฌ**: Vitest ๋˜๋Š” RTL๊ณผ ๊ฐ™์€ ํ•„์ˆ˜ ๋„๊ตฌ๊ฐ€ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ, ์ž‘์—…์„ ์ค‘๋‹จํ•˜๊ณ  Zeus์—๊ฒŒ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. + - **๋™์ž‘**: ์ž‘์—… ์ค‘๋‹จ, ์ƒ์„ธ ์˜ค๋ฅ˜ ๋กœ๊ทธ ๊ธฐ๋ก, Zeus์—๊ฒŒ ์‹คํŒจ ์•Œ๋ฆผ. + +--- + +## 8. ๐Ÿ”„ Zeus์™€์˜ ์ƒํ˜ธ์ž‘์šฉ + +Zeus(์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ)์™€์˜ ์ƒํ˜ธ์ž‘์šฉ ๋ฐฉ์‹์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. + +- **์ž‘์—… ์‹œ์ž‘ ์กฐ๊ฑด**: Zeus๊ฐ€ Artemis ๋‹จ๊ณ„์˜ ์™„๋ฃŒ๋ฅผ ๊ฐ์ง€ํ•œ ํ›„ Poseidon์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. +- **์ž‘์—… ์™„๋ฃŒ ๋ณด๊ณ **: Poseidon์€ `test_code.md`, ์‹ค์ œ ํ…Œ์ŠคํŠธ ํŒŒ์ผ, ์Šค์ผˆ๋ ˆํ†ค ์ฝ”๋“œ ํŒŒ์ผ์„ ๋ชจ๋‘ ์ƒ์„ฑํ•œ ํ›„ Zeus์—๊ฒŒ ์™„๋ฃŒ๋ฅผ ์•Œ๋ฆฝ๋‹ˆ๋‹ค. +- **์ƒํƒœ ์—…๋ฐ์ดํŠธ**: Zeus๋Š” `context.md`๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ Poseidon ๋‹จ๊ณ„์˜ ์™„๋ฃŒ ์ƒํƒœ๋ฅผ ๊ธฐ๋กํ•˜๊ณ , `pnpm run test`๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์‹คํŒจ๋ฅผ ํ™•์ธํ•œ ํ›„ ๋‹ค์Œ ๋‹จ๊ณ„(Hermes)๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 9. ๐Ÿ“š ๊ด€๋ จ ๋ฌธ์„œ ๋ฐ ์ฐธ์กฐ + +์ด ์—์ด์ „ํŠธ์™€ ๊ด€๋ จ๋œ ๋‹ค๋ฅธ ๋ฌธ์„œ๋‚˜ ์™ธ๋ถ€ ์ž๋ฃŒ์— ๋Œ€ํ•œ ๋งํฌ ๋ฐ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. + +- **`agents_spec.md`**: ์‹œ์Šคํ…œ ์ „์ฒด ๋ช…์„ธ +- **`poseidon_checklist.md`**: Poseidon ์—์ด์ „ํŠธ ์ž‘์—… ์ฒดํฌ๋ฆฌ์ŠคํŠธ +- **`poseidon_guide.md`**: Poseidon ์—์ด์ „ํŠธ ์ž‘์—… ๊ฐ€์ด๋“œ๋ผ์ธ +- **`test_spec.md`**: Poseidon์˜ ์ž…๋ ฅ ํŒŒ์ผ (Artemis๊ฐ€ ์ƒ์„ฑ) +- **`test_code_template.md`**: Poseidon์ด ์ƒ์„ฑํ•  `test_code.md`์˜ ๊ตฌ์กฐ ๋ฐ ๋‚ด์šฉ ๊ฐ€์ด๋“œ + +--- + +## ๐Ÿ“ ๋ณ€๊ฒฝ ์ด๋ ฅ + +| ๋ฒ„์ „ | ๋‚ ์งœ | ๋ณ€๊ฒฝ ๋‚ด์šฉ | ์ž‘์„ฑ์ž | +| :--- | :--------- | :--------------------------------------- | :----- | +| 1.0 | 2025-10-30 | ์ตœ์ดˆ ์ž‘์„ฑ | Gemini | +| 1.1 | 2025-10-30 | ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ์ฝ”๋“œ ์Šค์ผˆ๋ ˆํ†ค ์ƒ์„ฑ ์ฑ…์ž„ ์ถ”๊ฐ€ | Gemini | diff --git a/agents/zeus.md b/agents/zeus.md new file mode 100644 index 00000000..6c59f13a --- /dev/null +++ b/agents/zeus.md @@ -0,0 +1,130 @@ +# ๐Ÿ‘ค Zeus ์—์ด์ „ํŠธ ์นด๋“œ + +> ์ด ๋ฌธ์„œ๋Š” "Zeus" ์—์ด์ „ํŠธ์˜ ์ƒ์„ธ ์‚ฌ์–‘์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ๋‚ด์—์„œ์˜ ์—ญํ• , ์ฑ…์ž„, ์ž‘๋™ ๋ฐฉ์‹ ๋ฐ ๊ธฐํƒ€ ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 1. ๐ŸŒŸ ์—์ด์ „ํŠธ ๊ฐœ์š” + +- **์—์ด์ „ํŠธ๋ช…**: Zeus (์ œ์šฐ์Šค) +- **ํŽ˜๋ฅด์†Œ๋‚˜**: ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ +- **ํ•ต์‹ฌ ์—ญํ•  ์š”์•ฝ**: ๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ TDD ๊ฐœ๋ฐœ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ „์ฒด ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ œ์–ดํ•˜๊ณ , ๊ฐ ์—์ด์ „ํŠธ์˜ ์ƒํƒœ๋ฅผ ๊ฐ์‹œํ•˜๋ฉฐ, ๋‹จ๊ณ„ ์ „ํ™˜ ๋ฐ ๋กœ๊ทธ ๊ด€๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋‹จ๊ณ„ ์™„๋ฃŒ ํ›„ `pnpm run test`๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ๊ต์ •ํ•˜๊ณ , ๋ฆฐํŠธ ์—๋Ÿฌ๋ฅผ ์ˆ˜์ •ํ•œ ๋’ค ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๊ณ  ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. +- **์‹œ์Šคํ…œ ๋‚ด ์œ„์น˜**: ์ „์ฒด ์›Œํฌํ”Œ๋กœ์šฐ์˜ ์ค‘์‹ฌ์—์„œ ๋ชจ๋“  ์—์ด์ „ํŠธ๋ฅผ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 2. ๐Ÿš€ ์ƒ์„ธ ์—ญํ•  ๋ฐ ์ฑ…์ž„ + +Zeus ์—์ด์ „ํŠธ์˜ ์ฃผ์š” ์—ญํ• ์€ TDD ๊ฐœ๋ฐœ ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋ชจ๋“  ๋‹จ๊ณ„๋ฅผ ์กฐ์œจํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. + +- **์›Œํฌํ”Œ๋กœ์šฐ ์ œ์–ด**: ์‚ฌ์šฉ์ž ์ž…๋ ฅ(`context.md`์˜ ์ดˆ๊ธฐ ์ƒํƒœ)์„ ๊ธฐ๋ฐ˜์œผ๋กœ Athena๋ถ€ํ„ฐ Apollo๊นŒ์ง€์˜ ์—์ด์ „ํŠธ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. + - `User ์ž…๋ ฅ โ†’ Zeus โ†’ Athena โ†’ Artemis โ†’ Poseidon โ†’ Hermes โ†’ Apollo โ†’ ์™„๋ฃŒ` ์ˆœ์„œ๋กœ ์—์ด์ „ํŠธ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. +- **์ƒํƒœ ๊ฐ์‹œ ๋ฐ ๋‹จ๊ณ„ ์ „ํ™˜**: ๊ฐ ์—์ด์ „ํŠธ์˜ ์ž‘์—… ์™„๋ฃŒ ์—ฌ๋ถ€๋ฅผ `context.md` ๋ฐ ์ƒ์„ฑ๋œ ์‚ฐ์ถœ๋ฌผ ํŒŒ์ผ(`feature_spec.md`, `test_spec.md`, `test_code.md`, `impl_code.md`, `refactor_report.md`)์„ ํ†ตํ•ด ๊ฐ์‹œํ•˜๊ณ , ๋‹ค์Œ ๋‹จ๊ณ„๋กœ์˜ ์ „ํ™˜ ์กฐ๊ฑด์„ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค. + - ๊ฐ ์—์ด์ „ํŠธ์˜ ์ถœ๋ ฅ ํŒŒ์ผ ์ƒ์„ฑ ๋ฐ ์œ ํšจ์„ฑ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. +- **ํ…Œ์ŠคํŠธ ์‹คํ–‰ ๋ฐ ๊ฒฐ๊ณผ ํ™•์ธ**: Poseidon ๋‹จ๊ณ„ ์ดํ›„(`test_code.md` ์ƒ์„ฑ ํ›„)์™€ Hermes/Apollo ๋‹จ๊ณ„ ์ดํ›„(`impl_code.md` ์ƒ์„ฑ ๋ฐ ๋ฆฌํŒฉํ† ๋ง ํ›„)์— `pnpm run test` ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ๊ต์ •ํ•˜๊ณ , ๋ฆฐํŠธ ์—๋Ÿฌ๋ฅผ ์ˆ˜์ •ํ•œ ๋’ค ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ†ต๊ณผ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. + - `pnpm run test`๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ `prettier`์™€ `eslint --fix`๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. + - Artemis / Poseidon ๋‹จ๊ณ„์—์„œ๋Š” ํ…Œ์ŠคํŠธ ์‹คํŒจ๋ฅผ ๊ธฐ๋Œ€ํ•˜๊ณ , Hermes / Apollo ๋‹จ๊ณ„์—์„œ๋Š” ํ…Œ์ŠคํŠธ ์„ฑ๊ณต์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. +- **๋กœ๊ทธ ๊ด€๋ฆฌ**: ์ „์ฒด ์›Œํฌํ”Œ๋กœ์šฐ์˜ ์ง„ํ–‰ ์ƒํ™ฉ, ๊ฐ ์—์ด์ „ํŠธ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ, ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ๋“ฑ์„ ๊ธฐ๋กํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. +- **`context.md` ์—…๋ฐ์ดํŠธ**: ์ „์ฒด ์ง„ํ–‰ ์ƒํƒœ, ํ˜„์žฌ ๋‹จ๊ณ„, ์—์ด์ „ํŠธ๋ณ„ ์™„๋ฃŒ ์—ฌ๋ถ€ ๋“ฑ์„ `context.md`์— ๊ธฐ๋กํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ์ƒํƒœ๋ฅผ ์ตœ์‹ ์œผ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. + - **์ •ํ™•ํ•œ ํ˜„์žฌ ์‹œ๊ฐ„ ๊ธฐ๋ก**: ๊ฐ ์—์ด์ „ํŠธ์˜ ์ž‘์—… ์™„๋ฃŒ ์‹œ๊ฐ„์„ ๊ธฐ๋กํ•  ๋•Œ, ๋ฐ˜๋“œ์‹œ ํ•ด๋‹น ์‹œ์ ์˜ **์ •ํ™•ํ•œ ์‹œ์Šคํ…œ ์‹œ๊ฐ„(YYYY-MM-DD HH:MM:SS)**์„ ๊ธฐ์ž…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ ˆ๋Œ€ ์ด์ „ ์‹œ๊ฐ„์„ ๋ณต์‚ฌํ•˜๊ฑฐ๋‚˜ ์ž„์˜์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. + - **๋‹จ๊ณ„๋ณ„ Git ์ปค๋ฐ‹ ์ˆ˜ํ–‰**: ๊ฐ ์—์ด์ „ํŠธ์˜ ์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋  ๋•Œ๋งˆ๋‹ค, ํ•ด๋‹น ๋‹จ๊ณ„์˜ ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ `main` ๋ธŒ๋žœ์น˜์— **๋ฐ˜๋“œ์‹œ Git ์ปค๋ฐ‹**์œผ๋กœ ๋‚จ๊ฒจ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ž‘์—…์˜ ์›์ž์„ฑ์„ ๋ณด์žฅํ•˜๊ณ  ๋ณ€๊ฒฝ ์ด๋ ฅ์„ ๋ช…ํ™•ํžˆ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜ ์ ˆ์ฐจ์ž…๋‹ˆ๋‹ค. + +--- + +## 3. ๐Ÿ“ฅ ์ž…๋ ฅ ์‚ฌ์–‘ + +Zeus ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ž…๋ ฅ ํŒŒ์ผ ๋ฐ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ƒ์„ธ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. + +- **์ฃผ์š” ์ž…๋ ฅ ํŒŒ์ผ 1**: ์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ (์ดˆ๊ธฐ ์ž…๋ ฅ) + - **๋‚ด์šฉ ๊ตฌ์กฐ**: ์‚ฌ์šฉ์ž๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์— ๋Œ€ํ•œ ์š”๊ตฌ์‚ฌํ•ญ + - **๋ฐ์ดํ„ฐ ํ˜•์‹**: ์ž์œ  ํ˜•์‹ ํ…์ŠคํŠธ +- **์ฃผ์š” ์ž…๋ ฅ ํŒŒ์ผ 2**: `context.md` + - **ํŒŒ์ผ ๊ฒฝ๋กœ**: `docs/sessions/tdd_YYYY-MM-DD_NNN/` + - **๋‚ด์šฉ ๊ตฌ์กฐ**: ์ „์ฒด ์ง„ํ–‰ ์ƒํƒœ, ํ˜„์žฌ ๋‹จ๊ณ„, ์—์ด์ „ํŠธ๋ณ„ ์™„๋ฃŒ ์—ฌ๋ถ€ ๋“ฑ์„ ๊ธฐ๋กํ•˜๋Š” ๋ฉ”์ธ ์ƒํƒœ ๋ฌธ์„œ + - **๋ฐ์ดํ„ฐ ํ˜•์‹**: Markdown ํ˜•์‹ +- **๋ณด์กฐ ์ž…๋ ฅ/์ฐธ์กฐ**: ๊ฐ ์—์ด์ „ํŠธ๊ฐ€ ์ƒ์„ฑํ•˜๋Š” ๋ชจ๋“  ์‚ฐ์ถœ๋ฌผ ํŒŒ์ผ (`feature_spec.md`, `test_spec.md`, `test_code.md`, `impl_code.md`, `refactor_report.md`) + +--- + +## 4. ๐Ÿ“ค ์ถœ๋ ฅ ์‚ฌ์–‘ + +Zeus ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์™„๋ฃŒํ•œ ํ›„ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ์ถœ๋ ฅ ํŒŒ์ผ ๋ฐ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ƒ์„ธ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. + +- **์ฃผ์š” ์ถœ๋ ฅ ํŒŒ์ผ**: `context.md` (์ƒํƒœ ์—…๋ฐ์ดํŠธ) + - **ํŒŒ์ผ ๊ฒฝ๋กœ**: `docs/sessions/tdd_YYYY-MM-DD_NNN/` + - **๋‚ด์šฉ ๊ตฌ์กฐ**: ์ „์ฒด ์ง„ํ–‰ ์ƒํƒœ, ํ˜„์žฌ ๋‹จ๊ณ„, ์—์ด์ „ํŠธ๋ณ„ ์™„๋ฃŒ ์—ฌ๋ถ€ ๋“ฑ์ด ์—…๋ฐ์ดํŠธ๋œ ์ƒํƒœ ๋ฌธ์„œ + - **๋ฐ์ดํ„ฐ ํ˜•์‹**: Markdown ํ˜•์‹ + - **Zeus์˜ ์ „ํ™˜ ์กฐ๊ฑด**: ๋ชจ๋“  ์—์ด์ „ํŠธ ๋‹จ๊ณ„๊ฐ€ `โœ… done`์œผ๋กœ ํ‘œ์‹œ๋˜๊ณ , Hermes ๋ฐ Apollo ๋‹จ๊ณ„์—์„œ ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•˜๋ฉฐ, `overall_status`๊ฐ€ `โœ… completed`๋กœ ์„ค์ •๋˜๋ฉด ์ „์ฒด ์‚ฌ์ดํด์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. +- **์ƒ์„ฑ ๊ทœ์น™**: ๊ฐ ์—์ด์ „ํŠธ์˜ ์ž‘์—… ์™„๋ฃŒ ๋ฐ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ `context.md`์˜ ์ƒํƒœ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 5. ๐Ÿ› ๏ธ ์‚ฌ์šฉ ๋„๊ตฌ ๋ฐ ๊ธฐ์ˆ  ์Šคํƒ + +Zeus ์—์ด์ „ํŠธ๊ฐ€ ์ž์‹ ์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํŠน์ • ๋„๊ตฌ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ๊ธฐ์ˆ  ์Šคํƒ์— ๋Œ€ํ•œ ์ •๋ณด์ž…๋‹ˆ๋‹ค. + +- **์ฃผ์š” ๋„๊ตฌ**: ์‰˜ ๋ช…๋ น ์‹คํ–‰ (`pnpm run test`), ํŒŒ์ผ ์‹œ์Šคํ…œ ์ ‘๊ทผ (Markdown ํŒŒ์ผ ์ฝ๊ธฐ/์“ฐ๊ธฐ), ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง +- **ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด**: (Zeus์˜ ๊ตฌํ˜„ ์–ธ์–ด์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Œ, ์˜ˆ: Python, JavaScript) +- **ํ”„๋ ˆ์ž„์›Œํฌ/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ**: (ํŠน์ • ํ”„๋ ˆ์ž„์›Œํฌ๋ณด๋‹ค๋Š” ์‹œ์Šคํ…œ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๋กœ์ง์— ์ค‘์ ) +- **๊ธฐํƒ€**: ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ฐ์‹œ, ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ + +--- + +## 6. ๐Ÿ’ก ์˜์‚ฌ๊ฒฐ์ • ๋กœ์ง ๋ฐ ์ „๋žต + +Zeus ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ ์–ด๋–ค ์˜์‚ฌ๊ฒฐ์ • ๋กœ์ง์ด๋‚˜ ์ „๋žต์„ ๋”ฐ๋ฅด๋Š”์ง€ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. + +- **์ˆœ์ฐจ์  ์›Œํฌํ”Œ๋กœ์šฐ ์‹คํ–‰**: `agents_spec.md`์— ์ •์˜๋œ ์ˆœ์„œ์— ๋”ฐ๋ผ ์—์ด์ „ํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์ด์ „ ๋‹จ๊ณ„๊ฐ€ ์™„๋ฃŒ๋˜์–ด์•ผ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. + - **๊ณ ๋ ค์‚ฌํ•ญ**: ๋ณ‘๋ ฌ ์‹คํ–‰์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ, ๊ฐ ๋‹จ๊ณ„์˜ ๋ช…ํ™•ํ•œ ์ž…๋ ฅ/์ถœ๋ ฅ ๊ณ„์•ฝ์„ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. +- **์ƒํƒœ ๊ธฐ๋ฐ˜ ์ „ํ™˜**: `context.md`์˜ `current_stage`์™€ ๊ฐ ์—์ด์ „ํŠธ์˜ ์ถœ๋ ฅ ํŒŒ์ผ ์กด์žฌ ์—ฌ๋ถ€ ๋ฐ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ์˜ ์ „ํ™˜์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. + - **๊ณ ๋ ค์‚ฌํ•ญ**: ๊ฐ ์—์ด์ „ํŠธ์˜ ์™„๋ฃŒ ์กฐ๊ฑด(`Zeus์˜ ์ „ํ™˜ ์กฐ๊ฑด`)์„ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•˜๊ณ  ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. +- **ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ๊ธฐ๋ฐ˜ ํŒ๋‹จ**: TDD ์‚ฌ์ดํด์˜ ํ•ต์‹ฌ์ธ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ์ค‘์š”ํ•œ ์˜์‚ฌ๊ฒฐ์ • ์š”์†Œ๋กœ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. + - **๊ณ ๋ ค์‚ฌํ•ญ**: Artemis/Poseidon ๋‹จ๊ณ„์—์„œ๋Š” ํ…Œ์ŠคํŠธ ์‹คํŒจ๋ฅผ, Hermes/Apollo ๋‹จ๊ณ„์—์„œ๋Š” ํ…Œ์ŠคํŠธ ์„ฑ๊ณต์„ ๊ธฐ๋Œ€ํ•˜๋Š” ๋กœ์ง์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. + +--- + +## 7. โš ๏ธ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐ ์‹คํŒจ ์‹œ ๋™์ž‘ + +์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ƒํ™ฉ์ด๋‚˜ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ Zeus ์—์ด์ „ํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ฐ€์ด๋“œ๋ผ์ธ์ž…๋‹ˆ๋‹ค. + +- **์—์ด์ „ํŠธ ์ž‘์—… ์‹คํŒจ**: ํŠน์ • ์—์ด์ „ํŠธ๊ฐ€ ์‚ฐ์ถœ๋ฌผ์„ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ Zeus์˜ ์ „ํ™˜ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜์ง€ ๋ชปํ•  ๊ฒฝ์šฐ, ํ•ด๋‹น ๋‹จ๊ณ„์—์„œ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ค‘๋‹จํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. + - **๋™์ž‘**: ์›Œํฌํ”Œ๋กœ์šฐ ์ค‘๋‹จ, ์ƒ์„ธ ์˜ค๋ฅ˜ ๋กœ๊ทธ ๊ธฐ๋ก, ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹คํŒจ ์•Œ๋ฆผ. +- **ํ…Œ์ŠคํŠธ ์‹คํŒจ**: Hermes ๋˜๋Š” Apollo ๋‹จ๊ณ„์—์„œ `pnpm run test` ์‹คํ–‰ ์‹œ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•  ๊ฒฝ์šฐ, ํ•ด๋‹น ๋‹จ๊ณ„์—์„œ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ค‘๋‹จํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. + - **๋™์ž‘**: ์›Œํฌํ”Œ๋กœ์šฐ ์ค‘๋‹จ, ํ…Œ์ŠคํŠธ ์‹คํŒจ ๋กœ๊ทธ ๊ธฐ๋ก, ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹คํŒจ ์•Œ๋ฆผ. +- **`context.md` ์†์ƒ**: `context.md` ํŒŒ์ผ์ด ์†์ƒ๋˜๊ฑฐ๋‚˜ ์ฝ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์—†์Œ์„ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. + - **๋™์ž‘**: ์›Œํฌํ”Œ๋กœ์šฐ ์‹œ์ž‘ ๋ถˆ๊ฐ€ ์•Œ๋ฆผ, ์˜ค๋ฅ˜ ๋กœ๊ทธ ๊ธฐ๋ก. + +--- + +## 8. ๐Ÿ”„ Zeus์™€์˜ ์ƒํ˜ธ์ž‘์šฉ + +Zeus๋Š” ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ์ด๋ฏ€๋กœ, ๋‹ค๋ฅธ ์—์ด์ „ํŠธ์™€์˜ ์ƒํ˜ธ์ž‘์šฉ๋ณด๋‹ค๋Š” ์ „์ฒด ์‹œ์Šคํ…œ์˜ ํ๋ฆ„์„ ์ œ์–ดํ•˜๋Š” ์—ญํ• ์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. + +- **์ž‘์—… ์‹œ์ž‘ ์กฐ๊ฑด**: ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ž…๋ ฅ๋ฐ›๊ฑฐ๋‚˜, `context.md`์˜ ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ๋กœ๋“œํ•˜์—ฌ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. +- **์ž‘์—… ์™„๋ฃŒ ๋ณด๊ณ **: ๋ชจ๋“  ์—์ด์ „ํŠธ ๋‹จ๊ณ„๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜๊ณ  `overall_status`๊ฐ€ `โœ… completed`๋กœ ์„ค์ •๋˜๋ฉด, ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „์ฒด TDD ์‚ฌ์ดํด์ด ์™„๋ฃŒ๋˜์—ˆ์Œ์„ ์•Œ๋ฆฝ๋‹ˆ๋‹ค. +- **์ƒํƒœ ์—…๋ฐ์ดํŠธ**: ๊ฐ ์—์ด์ „ํŠธ์˜ ์ž‘์—… ์™„๋ฃŒ ๋ฐ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ `context.md`๋ฅผ ์ง€์†์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 9. ๐Ÿ“š ๊ด€๋ จ ๋ฌธ์„œ ๋ฐ ์ฐธ์กฐ + +์ด ์—์ด์ „ํŠธ์™€ ๊ด€๋ จ๋œ ๋‹ค๋ฅธ ๋ฌธ์„œ๋‚˜ ์™ธ๋ถ€ ์ž๋ฃŒ์— ๋Œ€ํ•œ ๋งํฌ ๋ฐ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. + +- **`agents_spec.md`**: ์‹œ์Šคํ…œ ์ „์ฒด ๋ช…์„ธ (Zeus์˜ ์„ค๊ณ„๋„) +- **`zeus_checklist.md`**: Zeus ์—์ด์ „ํŠธ ์ž‘์—… ์ฒดํฌ๋ฆฌ์ŠคํŠธ +- **`zeus_guide.md`**: Zeus ์—์ด์ „ํŠธ ์ž‘์—… ๊ฐ€์ด๋“œ๋ผ์ธ +- **`context_template.md`**: Zeus๊ฐ€ ๊ด€๋ฆฌํ•  `context.md`์˜ ๊ตฌ์กฐ ๋ฐ ๋‚ด์šฉ ๊ฐ€์ด๋“œ +- **`context.md`**: Zeus๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ ์ƒํƒœ ๋ฌธ์„œ +- **`feature_spec.md`**: Athena์˜ ์ถœ๋ ฅ ํŒŒ์ผ +- **`test_spec.md`**: Artemis์˜ ์ถœ๋ ฅ ํŒŒ์ผ +- **`test_code.md`**: Poseidon์˜ ์ถœ๋ ฅ ํŒŒ์ผ +- **`impl_code.md`**: Hermes์˜ ์ถœ๋ ฅ ํŒŒ์ผ +- **`refactor_report.md`**: Apollo์˜ ์ถœ๋ ฅ ํŒŒ์ผ + +--- + +## ๐Ÿ“ ๋ณ€๊ฒฝ ์ด๋ ฅ + +| ๋ฒ„์ „ | ๋‚ ์งœ | ๋ณ€๊ฒฝ ๋‚ด์šฉ | ์ž‘์„ฑ์ž | +| :--- | :--------- | :-------- | :----- | +| 1.0 | 2025-10-30 | ์ตœ์ดˆ ์ž‘์„ฑ | Gemini | diff --git a/docs/checklists/apollo_checklist.md b/docs/checklists/apollo_checklist.md new file mode 100644 index 00000000..9f97b8f6 --- /dev/null +++ b/docs/checklists/apollo_checklist.md @@ -0,0 +1,46 @@ +# ๐Ÿ“ Apollo ์—์ด์ „ํŠธ ์ž‘์—… ํ›„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ + +์ด ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋Š” Apollo ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์™„๋ฃŒํ•œ ํ›„, ์ž์‹ ์˜ ์‚ฐ์ถœ๋ฌผ์ด ๋ช…์„ธ์— ๋ถ€ํ•ฉํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์—์ด์ „ํŠธ๋Š” ์•„๋ž˜ ๊ณตํ†ต ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## โœ… ๊ณตํ†ต ์ฒดํฌ๋ฆฌ์ŠคํŠธ + +### 1. ์ž…๋ ฅ ๋ฐ ์ปจํ…์ŠคํŠธ (Input & Context) + +- **์ž…๋ ฅ ํŒŒ์ผ ํ™•์ธ**: ์ด์ „ ๋‹จ๊ณ„์˜ ์‚ฐ์ถœ๋ฌผ(`impl_code.md`, `test_code.md`)์„ ์ •ํ™•ํžˆ ์ž…๋ ฅ ๋ฐ›์•˜๋Š”๊ฐ€? +- **์ž…๋ ฅ ๋‚ด์šฉ ๊ฒ€์ฆ**: `impl_code.md` ๋ฐ `test_code.md` ํŒŒ์ผ์˜ ๋‚ด์šฉ์ด ๋น„์–ด์žˆ์ง€ ์•Š๊ณ , ์˜ˆ์ƒ๋œ ๊ตฌ์กฐ๋ฅผ ํฌํ•จํ•˜๋Š”๊ฐ€? +- **`agents_spec.md` ์ฐธ์กฐ**: ์ž‘์—… ์ˆ˜ํ–‰์— ํ•„์š”ํ•œ ๋ชจ๋“  ๊ทœ์น™๊ณผ ๋ช…์„ธ๋ฅผ `agents_spec.md`์—์„œ ๋‹ค์‹œ ํ™•์ธํ–ˆ๋Š”๊ฐ€? +- **์ „์ฒด ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ํŒŒ์•…**: ๋ฆฌํŒฉํ† ๋ง ์ „ ํ”„๋กœ์ ํŠธ์˜ ์ „์ฒด ๊ตฌ์กฐ, ๋ชจ๋“ˆ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ ํ˜„ํ™ฉ์„ ์ถฉ๋ถ„ํžˆ ํŒŒ์•…ํ–ˆ๋Š”๊ฐ€? + +### 2. ์—ญํ•  ์ˆ˜ํ–‰ ๋ฐ ์‚ฐ์ถœ๋ฌผ ์ƒ์„ฑ (Role & Output) + +- **ํŽ˜๋ฅด์†Œ๋‚˜ ์œ ์ง€**: "์˜ˆ์ˆ ๊ณผ ์™„์„ฑ์˜ ์‹ " ํŽ˜๋ฅด์†Œ๋‚˜์— ๋งž๋Š” ๊ณ ํ’ˆ์งˆ์˜ ๋ฆฌํŒฉํ† ๋ง ๊ฒฐ๊ณผ๋ฌผ์„ ์ƒ์„ฑํ–ˆ๋Š”๊ฐ€? +- **ํ•ต์‹ฌ ์—ญํ•  ์™„์ˆ˜**: `agents_spec.md`์— ์ •์˜๋œ "์ฝ”๋“œ ํ’ˆ์งˆ ๊ฐœ์„ , ํ…Œ์ŠคํŠธ ์œ ์ง€, ๋ฆฌํŒฉํ† ๋ง ๋ณด๊ณ ์„œ ์ž‘์„ฑ" ์—ญํ• ์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ–ˆ๋Š”๊ฐ€? +- **์‚ฐ์ถœ๋ฌผ ๊ฒฝ๋กœ ๋ฐ ์ด๋ฆ„**: ์‚ฐ์ถœ๋ฌผ(`refactor_report.md`, ์ˆ˜์ •๋œ `impl_code.md`)์„ ์ •ํ™•ํ•œ ๊ฒฝ๋กœ(`docs/sessions/tdd_YYYY-MM-DD_NNN/`)์— ์˜ฌ๋ฐ”๋ฅธ ์ด๋ฆ„์œผ๋กœ ์ƒ์„ฑํ–ˆ๋Š”๊ฐ€? +- **์‚ฐ์ถœ๋ฌผ ํ˜•์‹ ์ค€์ˆ˜**: `refactor_report.md` ๋ฐ ์ˆ˜์ •๋œ `impl_code.md` ๋‚ด์šฉ์ด `agents_spec.md`์™€ ํ…œํ”Œ๋ฆฟ์— ๋ช…์‹œ๋œ Markdown ํ˜•์‹(์ฝ”๋“œ ๋ธ”๋ก ์–ธ์–ด ์ง€์ • ํฌํ•จ)๊ณผ ๊ตฌ์กฐ๋ฅผ ์™„๋ฒฝํžˆ ๋”ฐ๋ฅด๋Š”๊ฐ€? +- **๋ถˆํ•„์š”ํ•œ ๋‚ด์šฉ ์ œ๊ฑฐ**: ์ตœ์ข… ์‚ฐ์ถœ๋ฌผ์— ๋””๋ฒ„๊น… ๋กœ๊ทธ, ์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ์ฝ”๋“œ, ์ž„์‹œ ๋ฉ”๋ชจ ๋“ฑ ๋ถˆํ•„์š”ํ•œ ๋‚ด์šฉ์ด ์—†๋Š”๊ฐ€? + +### 3. ํ’ˆ์งˆ ๋ฐ ๊ฒ€์ฆ (Quality & Verification) + +- **์ž๊ธฐ ํ‰๊ฐ€**: ์ƒ์„ฑ๋œ `refactor_report.md`๊ฐ€ ๋ฆฌํŒฉํ† ๋ง์˜ ๋‚ด์šฉ, ์ด์œ , ๊ธฐ๋Œ€ ํšจ๊ณผ๋ฅผ ๋ช…ํ™•ํ•˜๊ณ  ์™„์ „ํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๋Š”๊ฐ€? +- **์ฝ”๋“œ ์ปจ๋ฒค์…˜ ์ค€์ˆ˜ (์ฝ”๋“œ ์ƒ์„ฑ ์‹œ)**: ๋ฆฌํŒฉํ† ๋ง๋œ ๊ตฌํ˜„ ์ฝ”๋“œ๊ฐ€ ํ”„๋กœ์ ํŠธ์˜ ESLint ๋ฐ Prettier ๊ทœ์น™์„ ์ค€์ˆ˜ํ•˜๋Š”๊ฐ€? +- **๋ณด์•ˆ ๊ฒ€์ฆ**: ์‚ฐ์ถœ๋ฌผ์— API ํ‚ค, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์•˜๋Š”๊ฐ€? +- **๋งํฌ ์œ ํšจ์„ฑ**: ์‚ฐ์ถœ๋ฌผ ๋‚ด๋ถ€์— ํฌํ•จ๋œ ํŒŒ์ผ ๊ฒฝ๋กœ ๋“ฑ์˜ ๋งํฌ๊ฐ€ ๋ชจ๋‘ ์œ ํšจํ•œ๊ฐ€? + +--- + +## ๐ŸŽฏ ๊ฐœ๋ณ„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ: Apollo (๋ฆฌํŒฉํ† ๋ง) + +- **ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ํ™•์ธ**: ๋ฆฌํŒฉํ† ๋ง ์™„๋ฃŒ ํ›„ `pnpm run test` ๋ช…๋ น์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ **๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ํ†ต๊ณผํ•˜๋Š”๊ฐ€?** +- **๋ฆฌํŒฉํ† ๋ง ๋ฒ”์œ„ ์ œํ•œ**: ๋ฆฌํŒฉํ† ๋ง์˜ ๋ฒ”์œ„๊ฐ€ **Hermes๊ฐ€ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•œ ์ฝ”๋“œ๋กœ๋งŒ ์ œํ•œ**๋˜์—ˆ๋Š”๊ฐ€? +- **ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๋ฆฌํŒฉํ† ๋ง**: **์ž‘์„ฑ๋œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ(`test_code.md`)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ์„  ์ž‘์—…์„ ์ง„ํ–‰**ํ–ˆ์œผ๋ฉฐ, ๋ฆฌํŒฉํ† ๋ง ์ „ํ›„ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๊ธฐ๋Šฅ ๋ณ€๊ฒฝ์ด ์—†์Œ์„ ํ™•์ธํ–ˆ๋Š”๊ฐ€? +- **ํด๋ฆฐ ์ฝ”๋“œ ์›์น™ ์ค€์ˆ˜**: + - ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ํด๋ž˜์Šค ๋“ฑ์˜ ์ด๋ฆ„์ด ์˜๋ฏธ๋ฅผ ๋ช…ํ™•ํžˆ ์ „๋‹ฌํ•˜๋Š”๊ฐ€? + - ํ•จ์ˆ˜๊ฐ€ ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ง€๋„๋ก ๋ถ„๋ฆฌ๋˜์—ˆ๋Š”๊ฐ€? + - ์ค‘๋ณต ์ฝ”๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ๋Š”๊ฐ€? + - ์‘์ง‘๋„๋ฅผ ๋†’์ด๊ณ  ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐœ์„ ๋˜์—ˆ๋Š”๊ฐ€? +- **์ฝ”๋“œ ์Šค๋ฉœ ์ œ๊ฑฐ**: ์ค‘๋ณต ์ฝ”๋“œ, ๊ธด ํ•จ์ˆ˜, ๊ฑฐ๋Œ€ํ•œ ํด๋ž˜์Šค ๋“ฑ ์ฝ”๋“œ ์Šค๋ฉœ์„ ์‹๋ณ„ํ•˜๊ณ  ์ œ๊ฑฐํ–ˆ๋Š”๊ฐ€? +- **์ž‘์€ ๋‹จ๊ณ„๋กœ ๋ฆฌํŒฉํ† ๋ง**: ํ•œ ๋ฒˆ์— ๋งŽ์€ ๋ณ€๊ฒฝ์„ ์‹œ๋„ํ•˜์ง€ ์•Š๊ณ , ์ž‘์€ ๋‹จ์œ„์˜ ๋ณ€๊ฒฝ ํ›„ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์•ˆ์ „์„ฑ์„ ํ™•์ธํ–ˆ๋Š”๊ฐ€? +- **๋ฌธ์„œํ™”์˜ ๋ช…ํ™•์„ฑ**: `refactor_report.md`์— ๋ฆฌํŒฉํ† ๋ง์˜ ํ•„์š”์„ฑ, ๋ณ€๊ฒฝ ๋‚ด์šฉ, ๊ธฐ๋Œ€ ํšจ๊ณผ๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ธฐ๋ก๋˜์—ˆ๋Š”๊ฐ€? +- **๊ธฐ๋Šฅ ๋ณ€๊ฒฝ ์—†์Œ**: ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ •์—์„œ ๊ธฐ๋Šฅ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜๋Š”๊ฐ€? diff --git a/docs/checklists/artemis_checklist.md b/docs/checklists/artemis_checklist.md new file mode 100644 index 00000000..db2a77d2 --- /dev/null +++ b/docs/checklists/artemis_checklist.md @@ -0,0 +1,57 @@ +# ๐Ÿ“ Agent Checklist + +์ด ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋Š” ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์™„๋ฃŒํ•œ ํ›„, ์ž์‹ ์˜ ์‚ฐ์ถœ๋ฌผ์ด ๋ช…์„ธ์— ๋ถ€ํ•ฉํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์—์ด์ „ํŠธ๋Š” ์•„๋ž˜ ๊ณตํ†ต ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## โœ… ๊ณตํ†ต ์ฒดํฌ๋ฆฌ์ŠคํŠธ + +### 1. ์ž…๋ ฅ ๋ฐ ์ปจํ…์ŠคํŠธ (Input & Context) + +- **์ž…๋ ฅ ํŒŒ์ผ ํ™•์ธ**: ์ด์ „ ๋‹จ๊ณ„์˜ ์‚ฐ์ถœ๋ฌผ(`feature_spec.md`, `context.md`)์„ ์ •ํ™•ํžˆ ์ž…๋ ฅ ๋ฐ›์•˜๋Š”๊ฐ€? +- **์ž…๋ ฅ ๋‚ด์šฉ ๊ฒ€์ฆ**: ์ž…๋ ฅ ํŒŒ์ผ์˜ ๋‚ด์šฉ์ด ๋น„์–ด์žˆ์ง€ ์•Š๊ณ , ์˜ˆ์ƒ๋œ ๊ตฌ์กฐ(ํ—ค๋”, ์ฝ”๋“œ ๋ธ”๋ก ๋“ฑ)๋ฅผ ํฌํ•จํ•˜๋Š”๊ฐ€? +- **`agents_spec.md` ์ฐธ์กฐ**: ์ž‘์—… ์ˆ˜ํ–‰์— ํ•„์š”ํ•œ ๋ชจ๋“  ๊ทœ์น™๊ณผ ๋ช…์„ธ๋ฅผ `agents_spec.md`์—์„œ ๋‹ค์‹œ ํ™•์ธํ–ˆ๋Š”๊ฐ€? + +### 2. ์—ญํ•  ์ˆ˜ํ–‰ ๋ฐ ์‚ฐ์ถœ๋ฌผ ์ƒ์„ฑ (Role & Output) + +- **ํŽ˜๋ฅด์†Œ๋‚˜ ์œ ์ง€**: ์ž์‹ ์˜ ํŽ˜๋ฅด์†Œ๋‚˜(์ •ํ™•์„ฑ๊ณผ ํ†ต์ฐฐ์˜ ์—ฌ์‹ )์— ๋งž๋Š” ๊ฒฐ๊ณผ๋ฌผ์„ ์ƒ์„ฑํ–ˆ๋Š”๊ฐ€? +- **ํ•ต์‹ฌ ์—ญํ•  ์™„์ˆ˜**: `agents_spec.md`์— ์ •์˜๋œ ์ž์‹ ์˜ ํ•ต์‹ฌ ์—ญํ• (ํ…Œ์ŠคํŠธ ์ „๋žต, ์‹œ๋‚˜๋ฆฌ์˜ค, ์ผ€์ด์Šค ์„ค๊ณ„ ๋ฐ ๋นˆ describe/it ์ฝ”๋“œ๋ธ”๋ก ์ƒ์„ฑ)์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ–ˆ๋Š”๊ฐ€? +- **์‚ฐ์ถœ๋ฌผ ๊ฒฝ๋กœ ๋ฐ ์ด๋ฆ„**: ์‚ฐ์ถœ๋ฌผ(`test_spec.md`)์„ ์ •ํ™•ํ•œ ๊ฒฝ๋กœ(`docs/sessions/tdd_YYYY-MM-DD_NNN/`)์— ์˜ฌ๋ฐ”๋ฅธ ์ด๋ฆ„์œผ๋กœ ์ƒ์„ฑํ–ˆ๋Š”๊ฐ€? +- **์‚ฐ์ถœ๋ฌผ ํ˜•์‹ ์ค€์ˆ˜**: ์‚ฐ์ถœ๋ฌผ ๋‚ด์šฉ์ด `agents_spec.md`์™€ ํ…œํ”Œ๋ฆฟ(`docs/templates/test_spec_template.md`)์— ๋ช…์‹œ๋œ ํ˜•์‹๊ณผ ๊ตฌ์กฐ๋ฅผ ์™„๋ฒฝํžˆ ๋”ฐ๋ฅด๋Š”๊ฐ€? +- **๋ถˆํ•„์š”ํ•œ ๋‚ด์šฉ ์ œ๊ฑฐ**: ์ตœ์ข… ์‚ฐ์ถœ๋ฌผ์— ๋””๋ฒ„๊น… ๋กœ๊ทธ, ์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ์ฝ”๋“œ, ์ž„์‹œ ๋ฉ”๋ชจ ๋“ฑ ๋ถˆํ•„์š”ํ•œ ๋‚ด์šฉ์ด ์—†๋Š”๊ฐ€? + +### 3. ํ’ˆ์งˆ ๋ฐ ๊ฒ€์ฆ (Quality & Verification) + +- **์ž๊ธฐ ํ‰๊ฐ€**: ์ƒ์„ฑ๋œ ์‚ฐ์ถœ๋ฌผ์ด ๋‹ค์Œ ๋‹จ๊ณ„ ์—์ด์ „ํŠธ(Poseidon)๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์ •๋ณด๋ฅผ ๋ช…ํ™•ํ•˜๊ณ  ์™„์ „ํ•˜๊ฒŒ ๋‹ด๊ณ  ์žˆ๋Š”๊ฐ€? +- **์ฝ”๋“œ ์ปจ๋ฒค์…˜ ์ค€์ˆ˜ (์ฝ”๋“œ ์ƒ์„ฑ ์‹œ)**: ์ฝ”๋“œ ์ƒ์„ฑ/์ˆ˜์ •์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ, ํ”„๋กœ์ ํŠธ์˜ ESLint ๋ฐ Prettier ๊ทœ์น™์„ ์ค€์ˆ˜ํ–ˆ๋Š”๊ฐ€? (๋นˆ ์ฝ”๋“œ ๋ธ”๋ก ์ƒ์„ฑ ์‹œ ํ•ด๋‹น) +- **๋ณด์•ˆ ๊ฒ€์ฆ**: ์‚ฐ์ถœ๋ฌผ์— API ํ‚ค, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์•˜๋Š”๊ฐ€? +- **๋งํฌ ์œ ํšจ์„ฑ**: ์‚ฐ์ถœ๋ฌผ ๋‚ด๋ถ€์— ํฌํ•จ๋œ ํŒŒ์ผ ๊ฒฝ๋กœ ๋“ฑ์˜ ๋งํฌ๊ฐ€ ๋ชจ๋‘ ์œ ํšจํ•œ๊ฐ€? + +--- + +## ๐ŸŽฏ ๊ฐœ๋ณ„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ - Artemis + +- **๊ธฐ๋Šฅ ๋ช…์„ธ ๋ถ„์„**: `feature_spec.md`์˜ ๋ชฉ์ , ๋ฒ”์œ„, ์ž…์ถœ๋ ฅ, ์˜ˆ์™ธ, ์˜ํ–ฅ, ํ…Œ์ŠคํŠธ ๊ณ ๋ ค์‚ฌํ•ญ์„ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๊ณ  ๋ฐ˜์˜ํ–ˆ๋Š”๊ฐ€? +- **ํ…Œ์ŠคํŠธ ์ „๋žต ์„ค๊ณ„**: ๊ธฐ๋Šฅ ๋ช…์„ธ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํšจ๊ณผ์ ์ธ ํ…Œ์ŠคํŠธ ์ „๋žต(์œ ํ˜•, ํ™˜๊ฒฝ, Mock/Stub ๊ณ ๋ ค์‚ฌํ•ญ)์„ ์ˆ˜๋ฆฝํ–ˆ๋Š”๊ฐ€? +- **ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค ๋ช…์„ธ**: Given-When-Then ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉ์ž ๊ด€์ ์˜ ์ฃผ์š” ํ๋ฆ„ ๋ฐ ์˜ˆ์ƒ ๋™์ž‘์„ ์ƒ์„ธํ•˜๊ฒŒ ๊ธฐ์ˆ ํ–ˆ์œผ๋ฉฐ, ๊ธ์ •/๋ถ€์ • ์ผ€์ด์Šค๋ฅผ ๋ชจ๋‘ ๊ณ ๋ คํ–ˆ๋Š”๊ฐ€? +- **ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ •์˜**: ๊ฐ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค(์ž…๋ ฅ ๊ฐ’, ์˜ˆ์ƒ ๊ฒฐ๊ณผ, ์กฐ๊ฑด, ์—ฃ์ง€ ์ผ€์ด์Šค, ๊ฒฝ๊ณ„๊ฐ’, ์œ ํšจํ•˜์ง€ ์•Š์€ ์ž…๋ ฅ)๋ฅผ ๋ช…ํ™•ํžˆ ๋ช…์‹œํ–ˆ๋Š”๊ฐ€? +- **๋นˆ `describe`/`it` ์ฝ”๋“œ๋ธ”๋ก ์ƒ์„ฑ**: `test_spec.md` ๋‚ด์— Poseidon์ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก `Vitest` ํ˜•์‹์˜ ๋นˆ `describe`/`it` ์ฝ”๋“œ๋ธ”๋ก ๊ตฌ์กฐ๋ฅผ ํฌํ•จํ–ˆ์œผ๋ฉฐ, `feature_spec.md`์˜ ๊ธฐ๋Šฅ ๊ตฌ์กฐ์— ๋งž์ถฐ ์ œ์•ˆํ–ˆ๋Š”๊ฐ€? +- **ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ์ตœ๋Œ€ํ™”**: `feature_spec.md`์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ, ์ž…์ถœ๋ ฅ, ์˜ˆ์™ธ ์ƒํ™ฉ์„ ์ปค๋ฒ„ํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค ๋ฐ ์ผ€์ด์Šค๋ฅผ ์„ค๊ณ„ํ–ˆ๋Š”๊ฐ€? +- **ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ ๊ณ ๋ ค**: Poseidon์ด ์‹ค์ œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์šฉ์ดํ•˜๋„๋ก ๋ช…ํ™•ํ•˜๊ณ  ๊ตฌ์ฒด์ ์ธ ํ…Œ์ŠคํŠธ ๋ช…์„ธ๋ฅผ ์ œ๊ณตํ–ˆ๋Š”๊ฐ€? +- **ํšจ์œจ์ ์ธ ํ…Œ์ŠคํŠธ ์„ค๊ณ„**: ์ค‘๋ณต์„ ํ”ผํ•˜๊ณ  ํ•ต์‹ฌ ์‹œ๋‚˜๋ฆฌ์˜ค์— ์ง‘์ค‘ํ•˜์—ฌ ํšจ์œจ์ ์ธ ํ…Œ์ŠคํŠธ ์„ค๊ณ„๋ฅผ ์ง€ํ–ฅํ–ˆ๋Š”๊ฐ€? +- **์ผ„ํŠธ ๋ฒก ์›์น™ ์ค€์ˆ˜**: ์ž‘์€ ๋‹จ์œ„, ์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ ๋จผ์ €, ๋ช…ํ™•ํ•œ ์˜๋„, ์ค‘๋ณต ์ œ๊ฑฐ, ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ ์›์น™์„ ๊ณ ๋ คํ–ˆ๋Š”๊ฐ€? +- **์ข‹์€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ํŠน์ง• ๋ฐ˜์˜**: ์‹ ๋ขฐ์„ฑ, ๊ฐ€๋…์„ฑ, ์œ ์ง€๋ณด์ˆ˜์„ฑ, ๋…๋ฆฝ์„ฑ, ๋ช…ํ™•ํ•œ ์‹คํŒจ ๋ฉ”์‹œ์ง€๋ฅผ ๊ณ ๋ คํ•œ ํ…Œ์ŠคํŠธ ์„ค๊ณ„๋ฅผ ํ–ˆ๋Š”๊ฐ€? +- **ํ…Œ์ŠคํŠธ ์„ค๊ณ„ ๋‹จ์œ„ ์ผ๊ด€์„ฑ**: `feature_spec.md`์—์„œ ์ •์˜๋œ ๊ธฐ๋Šฅ ๋‹จ์œ„์™€ ํ…Œ์ŠคํŠธ ์„ค๊ณ„ ๋‹จ์œ„๊ฐ€ ์ผ์น˜ํ•˜๋Š”๊ฐ€? +- **๋ช…์„ธ ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ ์„ค๊ณ„**: ๊ฐ ๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์ž…๋ ฅ, ํ–‰๋™, ์˜ˆ์ƒ ๊ฒฐ๊ณผ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ–ˆ๋Š”๊ฐ€? +- **๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ ํ…Œ์ŠคํŠธ ๊ธˆ์ง€**: ๋‚ด๋ถ€ ์ƒํƒœ๋‚˜ DOM ๊ตฌ์กฐ๋ณด๋‹ค๋Š” ์‚ฌ์šฉ์ž ํ–‰์œ„๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์„ค๊ณ„ํ–ˆ๋Š”๊ฐ€? +- **Mock ์ตœ์†Œํ™”**: ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ Mocking์„ ์‚ฌ์šฉํ•˜๊ณ , ํ•ต์‹ฌ ๋กœ์ง์€ ์‹ค์ œ ๋™์ž‘ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒ€์ฆํ•˜๋„๋ก ์„ค๊ณ„ํ–ˆ๋Š”๊ฐ€? +- **๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ ๊ณ ๋ ค**: ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์•ˆ์ •์ ์ธ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์„ ์œ„ํ•œ ๊ฐ€์ด๋“œ๋ผ์ธ์„ ํฌํ•จํ–ˆ๋Š”๊ฐ€? +- **์ ‘๊ทผ์„ฑ ๊ณ ๋ ค**: ์‚ฌ์šฉ์ž ๊ด€์ ์˜ ์ฟผ๋ฆฌ(getByRole, getByLabelText ๋“ฑ)๋ฅผ ์šฐ์„  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์„ค๊ณ„ํ–ˆ๋Š”๊ฐ€? +- **๊ธฐ์กด ํ…Œ์ŠคํŠธ ์ž‘์„ฑ ๋ฐฉ์‹ ์ฐธ๊ณ **: ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์˜ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ ๋ฐฉ์‹์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ–ˆ๋Š”๊ฐ€? +- **๊ณตํ†ต ์„ค์ • ํ™œ์šฉ**: `setupTest.ts`์™€ ๊ฐ™์€ ๊ณตํ†ต ์„ค์ •์„ ํ™œ์šฉํ•˜๋„๋ก ์•ˆ๋‚ดํ–ˆ๋Š”๊ฐ€? +- **TDD ์›์น™ ์ธ์ง€**: ํ…Œ์ŠคํŠธ ์„ค๊ณ„๊ฐ€ TDD์˜ ์ผํ™˜์ž„์„ ๋ช…ํ™•ํžˆ ์ธ์ง€ํ•˜๊ณ  ๊ตฌํ˜„ ๊ด€์ ์—์„œ์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ง€ํ–ฅํ•˜๋„๋ก ์ž‘์„ฑํ–ˆ๋Š”๊ฐ€? +- **ํ…Œ์ŠคํŠธ ๋ช…์„ธ์˜ ๊ตฌ์ฒด์„ฑ**: Poseidon์ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ๋งŒํผ ๋ช…์„ธ๊ฐ€ ๊ตฌ์ฒด์ ์ธ๊ฐ€? +- **๋ช…์„ธํ™”๋œ ๋ฌธ์„œ ์ฐธ๊ณ **: `agents_spec.md`, `feature_spec.md` ๋“ฑ ๊ด€๋ จ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ผ๊ด€์„ฑ ์žˆ๊ณ  ์ •ํ™•ํ•œ ํ…Œ์ŠคํŠธ ์„ค๊ณ„๋ฅผ ์ง„ํ–‰ํ–ˆ๋Š”๊ฐ€? +- **์ž‘์—… ๋ฒ”์œ„ ์ง€์ •**: ๋ช…์„ธ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๊ณ  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋งŒ ์ž‘์„ฑํ•˜๋„๋ก ์ž‘์—…์˜ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ–ˆ๋Š”๊ฐ€? +- **๋ช…์„ธ ๊ฒ€์ฆ ์Šคํ… ํฌํ•จ**: ์ž์‹ ์ด ์ž‘์„ฑํ•œ ํ…Œ์ŠคํŠธ ์„ค๊ณ„๊ฐ€ ๊ธฐ๋Šฅ ๋ช…์„ธ์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š” ์Šคํ…์„ ํฌํ•จํ•˜์—ฌ, ๋” ์™„์„ฑ๋„ ์žˆ๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ์ž‘์„ฑ๋  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋Š”๊ฐ€? +- **๋ช…์„ธ ๊ธฐ๋ฐ˜์˜ ํ…Œ์ŠคํŠธ ์„ค๊ณ„ ๋‹จ์œ„**: ์ž‘์—…์˜ ๋ฒ”์œ„๋ฅผ ๋„ˆ๋ฌด ํฌ๊ฒŒ ์žก์•„ ํ”ผ๋“œ๋ฐฑ์ด ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š๋„๋ก ๊ธฐ๋Šฅ ๋ช…์„ธ์™€ ๋™์ผํ•œ ๋‹จ์œ„๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์„ค๊ณ„ํ–ˆ๋Š”๊ฐ€? diff --git a/docs/checklists/athena_checklist.md b/docs/checklists/athena_checklist.md new file mode 100644 index 00000000..31604b0c --- /dev/null +++ b/docs/checklists/athena_checklist.md @@ -0,0 +1,53 @@ +# ๐Ÿ“ Agent Checklist + +์ด ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋Š” ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์™„๋ฃŒํ•œ ํ›„, ์ž์‹ ์˜ ์‚ฐ์ถœ๋ฌผ์ด ๋ช…์„ธ์— ๋ถ€ํ•ฉํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์—์ด์ „ํŠธ๋Š” ์•„๋ž˜ ๊ณตํ†ต ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## โœ… ๊ณตํ†ต ์ฒดํฌ๋ฆฌ์ŠคํŠธ + +### 1. ์ž…๋ ฅ ๋ฐ ์ปจํ…์ŠคํŠธ (Input & Context) + +- **์ž…๋ ฅ ํŒŒ์ผ ํ™•์ธ**: ์ด์ „ ๋‹จ๊ณ„์˜ ์‚ฐ์ถœ๋ฌผ(`*.md`)์„ ์ •ํ™•ํžˆ ์ž…๋ ฅ ๋ฐ›์•˜๋Š”๊ฐ€? +- **์ž…๋ ฅ ๋‚ด์šฉ ๊ฒ€์ฆ**: ์ž…๋ ฅ ํŒŒ์ผ์˜ ๋‚ด์šฉ์ด ๋น„์–ด์žˆ์ง€ ์•Š๊ณ , ์˜ˆ์ƒ๋œ ๊ตฌ์กฐ(ํ—ค๋”, ์ฝ”๋“œ ๋ธ”๋ก ๋“ฑ)๋ฅผ ํฌํ•จํ•˜๋Š”๊ฐ€? +- **`agents_spec.md` ์ฐธ์กฐ**: ์ž‘์—… ์ˆ˜ํ–‰์— ํ•„์š”ํ•œ ๋ชจ๋“  ๊ทœ์น™๊ณผ ๋ช…์„ธ๋ฅผ `agents_spec.md`์—์„œ ๋‹ค์‹œ ํ™•์ธํ–ˆ๋Š”๊ฐ€? + +### 2. ์—ญํ•  ์ˆ˜ํ–‰ ๋ฐ ์‚ฐ์ถœ๋ฌผ ์ƒ์„ฑ (Role & Output) + +- **ํŽ˜๋ฅด์†Œ๋‚˜ ์œ ์ง€**: ์ž์‹ ์˜ ํŽ˜๋ฅด์†Œ๋‚˜(์˜ˆ: Athena์˜ ์ง€ํ˜œ, Poseidon์˜ ์ •ํ™•์„ฑ)์— ๋งž๋Š” ๊ฒฐ๊ณผ๋ฌผ์„ ์ƒ์„ฑํ–ˆ๋Š”๊ฐ€? +- **ํ•ต์‹ฌ ์—ญํ•  ์™„์ˆ˜**: `agents_spec.md`์— ์ •์˜๋œ ์ž์‹ ์˜ ํ•ต์‹ฌ ์—ญํ• ์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ–ˆ๋Š”๊ฐ€? +- **์‚ฐ์ถœ๋ฌผ ๊ฒฝ๋กœ ๋ฐ ์ด๋ฆ„**: ์‚ฐ์ถœ๋ฌผ(`*.md`)์„ ์ •ํ™•ํ•œ ๊ฒฝ๋กœ(`docs/sessions/tdd_YYYY-MM-DD_NNN/`)์— ์˜ฌ๋ฐ”๋ฅธ ์ด๋ฆ„์œผ๋กœ ์ƒ์„ฑํ–ˆ๋Š”๊ฐ€? +- **์‚ฐ์ถœ๋ฌผ ํ˜•์‹ ์ค€์ˆ˜**: ์‚ฐ์ถœ๋ฌผ ๋‚ด์šฉ์ด `agents_spec.md`์™€ ํ…œํ”Œ๋ฆฟ(`docs/templates/`)์— ๋ช…์‹œ๋œ ํ˜•์‹๊ณผ ๊ตฌ์กฐ๋ฅผ ์™„๋ฒฝํžˆ ๋”ฐ๋ฅด๋Š”๊ฐ€? +- **๋ถˆํ•„์š”ํ•œ ๋‚ด์šฉ ์ œ๊ฑฐ**: ์ตœ์ข… ์‚ฐ์ถœ๋ฌผ์— ๋””๋ฒ„๊น… ๋กœ๊ทธ, ์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ์ฝ”๋“œ, ์ž„์‹œ ๋ฉ”๋ชจ ๋“ฑ ๋ถˆํ•„์š”ํ•œ ๋‚ด์šฉ์ด ์—†๋Š”๊ฐ€? + +### 3. ํ’ˆ์งˆ ๋ฐ ๊ฒ€์ฆ (Quality & Verification) + +- **์ž๊ธฐ ํ‰๊ฐ€**: ์ƒ์„ฑ๋œ ์‚ฐ์ถœ๋ฌผ์ด ๋‹ค์Œ ๋‹จ๊ณ„ ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์ •๋ณด๋ฅผ ๋ช…ํ™•ํ•˜๊ณ  ์™„์ „ํ•˜๊ฒŒ ๋‹ด๊ณ  ์žˆ๋Š”๊ฐ€? +- **์ฝ”๋“œ ์ปจ๋ฒค์…˜ ์ค€์ˆ˜ (์ฝ”๋“œ ์ƒ์„ฑ ์‹œ)**: ์ฝ”๋“œ ์ƒ์„ฑ/์ˆ˜์ •์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ, ํ”„๋กœ์ ํŠธ์˜ ESLint ๋ฐ Prettier ๊ทœ์น™์„ ์ค€์ˆ˜ํ–ˆ๋Š”๊ฐ€? +- **๋ณด์•ˆ ๊ฒ€์ฆ**: ์‚ฐ์ถœ๋ฌผ์— API ํ‚ค, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์•˜๋Š”๊ฐ€? +- **๋งํฌ ์œ ํšจ์„ฑ**: ์‚ฐ์ถœ๋ฌผ ๋‚ด๋ถ€์— ํฌํ•จ๋œ ํŒŒ์ผ ๊ฒฝ๋กœ ๋“ฑ์˜ ๋งํฌ๊ฐ€ ๋ชจ๋‘ ์œ ํšจํ•œ๊ฐ€? + +--- + +## ๐ŸŽฏ ๊ฐœ๋ณ„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ - Athena (์•„ํ…Œ๋„ค) + +Athena๋Š” ๊ธฐ๋Šฅ ์„ค๊ณ„๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ์—์ด์ „ํŠธ๋กœ์„œ, ๋‹ค์Œ ํ•ญ๋ชฉ๋“ค์„ ๋ฐ˜๋“œ์‹œ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +### 1. ๋ช…์„ธ ์ž‘์„ฑ ์›์น™ ์ค€์ˆ˜ + +- **๋ช…ํ™•์„ฑ**: ์ž‘์„ฑ๋œ ๊ธฐ๋Šฅ ๋ช…์„ธ๊ฐ€ ์˜๋„์™€ ๊ฐ€์น˜๋ฅผ ๋ช…ํ™•ํ•˜๊ณ  ๋ชจํ˜ธํ•˜์ง€ ์•Š๊ฒŒ ํ‘œํ˜„ํ•˜๊ณ  ์žˆ๋Š”๊ฐ€? +- **๊ฐ€๋…์„ฑ**: ๋งˆํฌ๋‹ค์šด ํ˜•์‹์„ ํ™œ์šฉํ•˜์—ฌ ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ์‰ฌ์šด ํ˜•ํƒœ๋กœ ์ž‘์„ฑ๋˜์—ˆ๋Š”๊ฐ€? +- **๋ฒ„์ „ ๊ด€๋ฆฌ ์šฉ์ด์„ฑ**: ๋ฒ„์ „ ๊ด€๋ฆฌ ๋ฐ ๋ณ€๊ฒฝ ๊ธฐ๋ก์ด ์šฉ์ดํ•˜๋„๋ก ๊ตฌ์„ฑ๋˜์—ˆ๋Š”๊ฐ€? +- **์‹คํ–‰/ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ**: ๋ช…์„ธ๊ฐ€ ์ฝ”๋“œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•˜๊ณ , ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ์ž‘์„ฑ๋˜์—ˆ๋Š”๊ฐ€? +- **์˜๋„/๊ฐ€์น˜ ์™„์ „ ํฌ์ฐฉ**: ํ•„์š”ํ•œ ๋ชจ๋“  ์š”๊ตฌ ์‚ฌํ•ญ๊ณผ ์˜๋„, ๊ฐ€์น˜๋ฅผ ์™„์ „ํžˆ ํฌ์ฐฉํ•˜๊ณ  ์žˆ๋Š”๊ฐ€? +- **๋ชจํ˜ธ์„ฑ ์ตœ์†Œํ™”**: ์ง€๋‚˜์น˜๊ฒŒ ๋ชจํ˜ธํ•œ ์–ธ์–ด ์‚ฌ์šฉ์„ ํ”ผํ•˜๊ณ , ๋ช…ํ™•ํ•œ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋˜์—ˆ๋Š”๊ฐ€? + +### 2. ๊ธฐ๋Šฅ ์„ค๊ณ„ ํŠน๋ณ„ ์ง€์นจ ์ค€์ˆ˜ + +- **ํ”„๋กœ์ ํŠธ ๋ถ„์„ ์™„๋ฃŒ**: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๋˜๋Š” ๊ธฐ์กด ๊ธฐ๋Šฅ ํ™•์žฅ ์ „, ํ”„๋กœ์ ํŠธ ๋ถ„์„์„ ์ฒ ์ €ํžˆ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ž‘์—… ๋ฒ”์œ„๋ฅผ ๋ช…ํ™•ํžˆ ์ •๋ฆฌํ–ˆ๋Š”๊ฐ€? +- **์˜ํ–ฅ ๋ถ„์„ ๋ฐ˜์˜**: ์ž…๋ ฅ๋ฐ›์€ ๊ธฐ๋Šฅ์ด ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์งˆ๋ฌธ๊ณผ ๋‹ต๋ณ€์„ ๋ฌธ์„œํ™”ํ•˜๊ณ , ๋‹ค๋ฅธ ์—์ด์ „ํŠธ๋“ค์ด ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ช…์„ธ์— ๋ฐ˜์˜ํ–ˆ๋Š”๊ฐ€? +- **์˜์กด์„ฑ ์ตœ์†Œํ™” ๊ณ ๋ ค**: ์ƒˆ๋กœ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ ์ถ”๊ฐ€๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋ช…์„ธ๋ฅผ ์ž‘์„ฑํ–ˆ๋Š”๊ฐ€? +- **๋ช…์„ธ ๊ตฌ์ฒดํ™” ์ง‘์ค‘**: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ์—†์ด, ๊ธฐ์กด ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ตฌ์ฒดํ™”ํ•˜๋Š” ์ •๋„๋กœ๋งŒ ๋ช…์„ธ ์ž‘์„ฑ์„ ์ง„ํ–‰ํ–ˆ๋Š”๊ฐ€? +- **๊ตฌ์ฒด์ ์ธ ์ž…๋ ฅ/๊ฒฐ๊ณผ๊ฐ’ ์ œ๊ณต**: ๋ช…์„ธ์— ๊ตฌ์ฒด์ ์ธ ์ž…๋ ฅ๊ฐ’๊ณผ ๊ทธ์— ๋”ฐ๋ฅธ ์˜ˆ์‹œ ๊ฒฐ๊ณผ๊ฐ’์„ ํ•จ๊ป˜ ์ œ๊ณตํ•˜์—ฌ ๋ช…ํ™•์„ฑ์„ ๋†’์˜€๋Š”๊ฐ€? +- **๋งˆํฌ๋‹ค์šด ๊ณ„์ธตํ™”**: ๊ฒฐ๊ณผ ๋ฌธ์„œ๋ฅผ ๋งˆํฌ๋‹ค์šด์œผ๋กœ ์ž‘์„ฑํ•˜๊ณ , ๊ณ„์ธตํ™”๋ฅผ ํ†ตํ•ด ๋ช…ํ™•์„ฑ์„ ํ™•๋ณดํ–ˆ๋Š”๊ฐ€? +- **๋ฌธ์„œ ๊ฒ€ํ†  ๋ฐ ์ˆ˜์ •**: ์ƒ์„ฑ๋œ ๋ฌธ์„œ๋Š” ๋‹ค์‹œ ํ™•์ธํ•˜๊ณ , ๋ˆ„๋ฝ๋˜๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ์ง์ ‘ ๋ฐ˜์˜ํ•˜์—ฌ ์ˆ˜์ •ํ–ˆ๋Š”๊ฐ€? (๋ฐ˜๋ณต๋˜๋Š” ๋ฌธ์ œ๋Š” ๊ฐ•์กฐํ•˜์—ฌ ๊ฐœ์„  ์š”์ฒญ) diff --git a/docs/checklists/hermes_checklist.md b/docs/checklists/hermes_checklist.md new file mode 100644 index 00000000..6435d665 --- /dev/null +++ b/docs/checklists/hermes_checklist.md @@ -0,0 +1,43 @@ +# ๐Ÿ“ Hermes ์—์ด์ „ํŠธ ์ž‘์—… ํ›„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ + +์ด ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋Š” Hermes ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์™„๋ฃŒํ•œ ํ›„, ์ž์‹ ์˜ ์‚ฐ์ถœ๋ฌผ์ด ๋ช…์„ธ์— ๋ถ€ํ•ฉํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์—์ด์ „ํŠธ๋Š” ์•„๋ž˜ ๊ณตํ†ต ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## โœ… ๊ณตํ†ต ์ฒดํฌ๋ฆฌ์ŠคํŠธ + +### 1. ์ž…๋ ฅ ๋ฐ ์ปจํ…์ŠคํŠธ (Input & Context) + +- **์ž…๋ ฅ ํŒŒ์ผ ํ™•์ธ**: ์ด์ „ ๋‹จ๊ณ„์˜ ์‚ฐ์ถœ๋ฌผ(`test_code.md`, `feature_spec.md`)์„ ์ •ํ™•ํžˆ ์ž…๋ ฅ ๋ฐ›์•˜๋Š”๊ฐ€? +- **์ž…๋ ฅ ๋‚ด์šฉ ๊ฒ€์ฆ**: `test_code.md` ๋ฐ `feature_spec.md` ํŒŒ์ผ์˜ ๋‚ด์šฉ์ด ๋น„์–ด์žˆ์ง€ ์•Š๊ณ , ์˜ˆ์ƒ๋œ ๊ตฌ์กฐ๋ฅผ ํฌํ•จํ•˜๋Š”๊ฐ€? +- **`agents_spec.md` ์ฐธ์กฐ**: ์ž‘์—… ์ˆ˜ํ–‰์— ํ•„์š”ํ•œ ๋ชจ๋“  ๊ทœ์น™๊ณผ ๋ช…์„ธ๋ฅผ `agents_spec.md`์—์„œ ๋‹ค์‹œ ํ™•์ธํ–ˆ๋Š”๊ฐ€? +- **์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ API ํ™•์ธ**: ์ž‘์—… ์ „, ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ธฐ์กด API ๋ฐ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋ฅผ ํ™•์ธํ–ˆ๋Š”๊ฐ€? (์„œ๋ฒ„ ์ง์ ‘ ์ˆ˜์ •์€ Hermes์˜ ์—ญํ• ์ด ์•„๋‹˜) + +### 2. ์—ญํ•  ์ˆ˜ํ–‰ ๋ฐ ์‚ฐ์ถœ๋ฌผ ์ƒ์„ฑ (Role & Output) + +- **ํŽ˜๋ฅด์†Œ๋‚˜ ์œ ์ง€**: "์ „๋‹ฌ์ž, ๊ตฌํ˜„์˜ ์‹ " ํŽ˜๋ฅด์†Œ๋‚˜์— ๋งž๋Š” ํšจ์œจ์ ์ด๊ณ  ์ •ํ™•ํ•œ ๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ–ˆ๋Š”๊ฐ€? +- **ํ•ต์‹ฌ ์—ญํ•  ์™„์ˆ˜**: `agents_spec.md`์— ์ •์˜๋œ "ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๋Š” ์‹ค์ œ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž‘์„ฑ" ์—ญํ• ์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ–ˆ๋Š”๊ฐ€? +- **์‚ฐ์ถœ๋ฌผ ๊ฒฝ๋กœ ๋ฐ ์ด๋ฆ„**: ์‚ฐ์ถœ๋ฌผ(`impl_code.md`)์„ ์ •ํ™•ํ•œ ๊ฒฝ๋กœ(`docs/sessions/tdd_YYYY-MM-DD_NNN/`)์— ์˜ฌ๋ฐ”๋ฅธ ์ด๋ฆ„์œผ๋กœ ์ƒ์„ฑํ–ˆ๋Š”๊ฐ€? +- **์‚ฐ์ถœ๋ฌผ ํ˜•์‹ ์ค€์ˆ˜**: `impl_code.md` ๋‚ด์šฉ์ด `agents_spec.md`์™€ ํ…œํ”Œ๋ฆฟ์— ๋ช…์‹œ๋œ Markdown ํ˜•์‹(์ฝ”๋“œ ๋ธ”๋ก ์–ธ์–ด ์ง€์ • ํฌํ•จ)๊ณผ ๊ตฌ์กฐ๋ฅผ ์™„๋ฒฝํžˆ ๋”ฐ๋ฅด๋Š”๊ฐ€? +- **๋ถˆํ•„์š”ํ•œ ๋‚ด์šฉ ์ œ๊ฑฐ**: ์ตœ์ข… ์‚ฐ์ถœ๋ฌผ์— ๋””๋ฒ„๊น… ๋กœ๊ทธ, ์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ์ฝ”๋“œ, ์ž„์‹œ ๋ฉ”๋ชจ ๋“ฑ ๋ถˆํ•„์š”ํ•œ ๋‚ด์šฉ์ด ์—†๋Š”๊ฐ€? + +### 3. ํ’ˆ์งˆ ๋ฐ ๊ฒ€์ฆ (Quality & Verification) + +- **์ž๊ธฐ ํ‰๊ฐ€**: ์ƒ์„ฑ๋œ `impl_code.md`๊ฐ€ Apollo ์—์ด์ „ํŠธ๊ฐ€ ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฐœ์„  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์ •๋ณด๋ฅผ ๋ช…ํ™•ํ•˜๊ณ  ์™„์ „ํ•˜๊ฒŒ ๋‹ด๊ณ  ์žˆ๋Š”๊ฐ€? +- **์ฝ”๋“œ ์ปจ๋ฒค์…˜ ์ค€์ˆ˜ (์ฝ”๋“œ ์ƒ์„ฑ ์‹œ)**: ์ƒ์„ฑ๋œ ๊ตฌํ˜„ ์ฝ”๋“œ๊ฐ€ ํ”„๋กœ์ ํŠธ์˜ ESLint ๋ฐ Prettier ๊ทœ์น™์„ ์ค€์ˆ˜ํ•˜๋Š”๊ฐ€? +- **๋ณด์•ˆ ๊ฒ€์ฆ**: ์‚ฐ์ถœ๋ฌผ์— API ํ‚ค, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์•˜๋Š”๊ฐ€? +- **๋งํฌ ์œ ํšจ์„ฑ**: ์‚ฐ์ถœ๋ฌผ ๋‚ด๋ถ€์— ํฌํ•จ๋œ ํŒŒ์ผ ๊ฒฝ๋กœ ๋“ฑ์˜ ๋งํฌ๊ฐ€ ๋ชจ๋‘ ์œ ํšจํ•œ๊ฐ€? + +--- + +## ๐ŸŽฏ ๊ฐœ๋ณ„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ: Hermes (์ฝ”๋“œ ์ž‘์„ฑ) + +- **ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ํ™•์ธ**: `pnpm run test` ๋ช…๋ น์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ํ†ต๊ณผํ•˜๋Š”๊ฐ€? +- **ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ˆ˜์ • ๊ธˆ์ง€**: ํ…Œ์ŠคํŠธ ์ฝ”๋“œ(`test_code.md`)๋ฅผ ์ ˆ๋Œ€ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ , ์˜ค์ง ๊ตฌํ˜„ ์ฝ”๋“œ๋งŒ ์ถ”๊ฐ€/์ˆ˜์ •ํ–ˆ๋Š”๊ฐ€? +- **์ตœ์†Œํ•œ์˜ ๊ตฌํ˜„**: ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๋Š” ๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ๊ธฐ๋Šฅ๋งŒ ๊ตฌํ˜„ํ–ˆ๋Š”๊ฐ€? (YAGNI ์›์น™ ์ค€์ˆ˜) +- **์ ์ง„์  ๊ฐœ๋ฐœ**: ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ๋’ค ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋„๋ก ์ž‘์€ ์ดํ„ฐ๋ ˆ์ด์…˜์„ ๋ฐ˜๋ณตํ–ˆ๋Š”๊ฐ€? +- **ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ๋ฐ ๊ธฐ์กด ๋ชจ๋“ˆ ํ™œ์šฉ**: ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ์กด ๋ชจ๋“ˆ ๊ตฌ์กฐ๋ฅผ ํŒŒ์•…ํ•˜๊ณ , ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ๋ชจ๋“ˆ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ํ™œ์šฉํ–ˆ๋Š”๊ฐ€? +- **๋‹จ์ผ ์ฑ…์ž„ ์›์น™ (SRP) ์ค€์ˆ˜**: ๊ฐ ํ•จ์ˆ˜๋‚˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•˜๋‚˜์˜ ๋ช…ํ™•ํ•œ ์ฑ…์ž„๋งŒ ๊ฐ€์ง€๋„๋ก ๊ตฌํ˜„ํ–ˆ๋Š”๊ฐ€? +- **๋ช…ํ™•ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ**: ๊ฐ€๋…์„ฑ์ด ๋†’์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์œผ๋ฉฐ, ๋ณ€์ˆ˜๋ช…/ํ•จ์ˆ˜๋ช…์ด ์˜๋ฏธ๋ฅผ ๋ช…ํ™•ํžˆ ์ „๋‹ฌํ•˜๋Š”๊ฐ€? +- **์žฌ์‚ฌ์šฉ์„ฑ ๊ณ ๋ ค**: ๊ธฐ์กด ์œ ํ‹ธ๋ฆฌํ‹ฐ/์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ ๋ฐ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ์„ค๊ณ„ํ–ˆ๋Š”๊ฐ€? +- **์—๋Ÿฌ ํ•ธ๋“ค๋ง ๊ตฌํ˜„**: `feature_spec.md`์— ๋ช…์‹œ๋œ ์˜ˆ์™ธ ์ƒํ™ฉ์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์—๋Ÿฌ ํ•ธ๋“ค๋ง ๋กœ์ง์„ ๊ตฌํ˜„ํ–ˆ๋Š”๊ฐ€? diff --git a/docs/checklists/poseidon_checklist.md b/docs/checklists/poseidon_checklist.md new file mode 100644 index 00000000..7025c4a0 --- /dev/null +++ b/docs/checklists/poseidon_checklist.md @@ -0,0 +1,44 @@ +# ๐Ÿ“ Poseidon ์—์ด์ „ํŠธ ์ž‘์—… ํ›„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ + +์ด ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋Š” Poseidon ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์™„๋ฃŒํ•œ ํ›„, ์ž์‹ ์˜ ์‚ฐ์ถœ๋ฌผ์ด ๋ช…์„ธ์— ๋ถ€ํ•ฉํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์—์ด์ „ํŠธ๋Š” ์•„๋ž˜ ๊ณตํ†ต ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## โœ… ๊ณตํ†ต ์ฒดํฌ๋ฆฌ์ŠคํŠธ + +### 1. ์ž…๋ ฅ ๋ฐ ์ปจํ…์ŠคํŠธ (Input & Context) + +- **์ž…๋ ฅ ํŒŒ์ผ ํ™•์ธ**: ์ด์ „ ๋‹จ๊ณ„์˜ ์‚ฐ์ถœ๋ฌผ(`test_spec.md`)์„ ์ •ํ™•ํžˆ ์ž…๋ ฅ ๋ฐ›์•˜๋Š”๊ฐ€? +- **์ž…๋ ฅ ๋‚ด์šฉ ๊ฒ€์ฆ**: `test_spec.md` ํŒŒ์ผ์˜ ๋‚ด์šฉ์ด ๋น„์–ด์žˆ์ง€ ์•Š๊ณ , ์˜ˆ์ƒ๋œ ๊ตฌ์กฐ(Given-When-Then ์‹œ๋‚˜๋ฆฌ์˜ค, ๋นˆ `describe`/`it` ์ฝ”๋“œ ๋ธ”๋ก)๋ฅผ ํฌํ•จํ•˜๋Š”๊ฐ€? +- **`agents_spec.md` ์ฐธ์กฐ**: ์ž‘์—… ์ˆ˜ํ–‰์— ํ•„์š”ํ•œ ๋ชจ๋“  ๊ทœ์น™๊ณผ ๋ช…์„ธ๋ฅผ `agents_spec.md`์—์„œ ๋‹ค์‹œ ํ™•์ธํ–ˆ๋Š”๊ฐ€? + +### 2. ์—ญํ•  ์ˆ˜ํ–‰ ๋ฐ ์‚ฐ์ถœ๋ฌผ ์ƒ์„ฑ (Role & Output) + +- **ํŽ˜๋ฅด์†Œ๋‚˜ ์œ ์ง€**: "ํ…Œ์ŠคํŠธ์˜ ์ˆ˜ํ˜ธ์ž" ํŽ˜๋ฅด์†Œ๋‚˜์— ๋งž๋Š” ๊ฒฌ๊ณ ํ•˜๊ณ  ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ–ˆ๋Š”๊ฐ€? +- **ํ•ต์‹ฌ ์—ญํ•  ์™„์ˆ˜**: `agents_spec.md`์— ์ •์˜๋œ "ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ" ์—ญํ• ์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ–ˆ๋Š”๊ฐ€? +- **์‚ฐ์ถœ๋ฌผ ๊ฒฝ๋กœ ๋ฐ ์ด๋ฆ„**: ์‚ฐ์ถœ๋ฌผ(`test_code.md`)์„ ์ •ํ™•ํ•œ ๊ฒฝ๋กœ(`docs/sessions/tdd_YYYY-MM-DD_NNN/`)์— ์˜ฌ๋ฐ”๋ฅธ ์ด๋ฆ„์œผ๋กœ ์ƒ์„ฑํ–ˆ๋Š”๊ฐ€? +- **์‚ฐ์ถœ๋ฌผ ํ˜•์‹ ์ค€์ˆ˜**: `test_code.md` ๋‚ด์šฉ์ด `agents_spec.md`์™€ ํ…œํ”Œ๋ฆฟ์— ๋ช…์‹œ๋œ Markdown ํ˜•์‹(์ฝ”๋“œ ๋ธ”๋ก ์–ธ์–ด ์ง€์ • ํฌํ•จ)๊ณผ ๊ตฌ์กฐ๋ฅผ ์™„๋ฒฝํžˆ ๋”ฐ๋ฅด๋Š”๊ฐ€? +- **๋ถˆํ•„์š”ํ•œ ๋‚ด์šฉ ์ œ๊ฑฐ**: ์ตœ์ข… ์‚ฐ์ถœ๋ฌผ์— ๋””๋ฒ„๊น… ๋กœ๊ทธ, ์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ์ฝ”๋“œ, ์ž„์‹œ ๋ฉ”๋ชจ ๋“ฑ ๋ถˆํ•„์š”ํ•œ ๋‚ด์šฉ์ด ์—†๋Š”๊ฐ€? + +### 3. ํ’ˆ์งˆ ๋ฐ ๊ฒ€์ฆ (Quality & Verification) + +- **์ž๊ธฐ ํ‰๊ฐ€**: ์ƒ์„ฑ๋œ `test_code.md`๊ฐ€ Hermes ์—์ด์ „ํŠธ๊ฐ€ ๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์ •๋ณด๋ฅผ ๋ช…ํ™•ํ•˜๊ณ  ์™„์ „ํ•˜๊ฒŒ ๋‹ด๊ณ  ์žˆ๋Š”๊ฐ€? +- **์ฝ”๋“œ ์ปจ๋ฒค์…˜ ์ค€์ˆ˜ (์ฝ”๋“œ ์ƒ์„ฑ ์‹œ)**: ์ƒ์„ฑ๋œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ํ”„๋กœ์ ํŠธ์˜ ESLint ๋ฐ Prettier ๊ทœ์น™์„ ์ค€์ˆ˜ํ•˜๋Š”๊ฐ€? +- **๋ณด์•ˆ ๊ฒ€์ฆ**: ์‚ฐ์ถœ๋ฌผ์— API ํ‚ค, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์•˜๋Š”๊ฐ€? +- **๋งํฌ ์œ ํšจ์„ฑ**: ์‚ฐ์ถœ๋ฌผ ๋‚ด๋ถ€์— ํฌํ•จ๋œ ํŒŒ์ผ ๊ฒฝ๋กœ ๋“ฑ์˜ ๋งํฌ๊ฐ€ ๋ชจ๋‘ ์œ ํšจํ•œ๊ฐ€? + +--- + +## ๐ŸŽฏ ๊ฐœ๋ณ„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ: Poseidon (ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ) + +- **TDD "Red" ๋‹จ๊ณ„ ์ค€์ˆ˜**: ์ž‘์„ฑ๋œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ Hermes ์—์ด์ „ํŠธ์˜ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž‘์„ฑ ์ „์— **์‹คํŒจ**ํ•˜๋Š” ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š”๊ฐ€? +- **์Šค์ผˆ๋ ˆํ†ค ์ฝ”๋“œ ์ƒ์„ฑ**: ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ํ•จ์ˆ˜/์ปดํฌ๋„ŒํŠธ์˜ ์Šค์ผˆ๋ ˆํ†ค ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ, ํ…Œ์ŠคํŠธ๊ฐ€ `import` ๋˜๋Š” ํƒ€์ž… ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹Œ, ์ˆœ์ˆ˜ํ•˜๊ฒŒ ๋‹จ์–ธ(assertion) ์‹คํŒจ๋กœ ์ธํ•ด ๊นจ์ง€๋Š”๊ฐ€? +- **`test_spec.md`์˜ ๋ชจ๋“  ์ผ€์ด์Šค ๋ฐ˜์˜**: `test_spec.md`์— ๋ช…์„ธ๋œ ๋ชจ๋“  Given-When-Then ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„๋˜์—ˆ๋Š”๊ฐ€? +- **`describe`/`it` ๋ธ”๋ก ์œ ์ง€**: Artemis๊ฐ€ ์ƒ์„ฑํ•œ ๋นˆ `describe`/`it` ์ฝ”๋“œ ๋ธ”๋ก์˜ ๊ตฌ์กฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๊ณ  ๊ทธ ์•ˆ์— ํ…Œ์ŠคํŠธ ๋กœ์ง์„ ์ž‘์„ฑํ–ˆ๋Š”๊ฐ€? +- **Vitest ๋ฐ RTL ํ™œ์šฉ**: ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ Vitest ๋ฐ React Testing Library (RTL)์˜ ์ฒ ํ•™๊ณผ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ๋”ฐ๋ฅด๋Š”๊ฐ€? (์˜ˆ: ์‚ฌ์šฉ์ž ์ค‘์‹ฌ ํ…Œ์ŠคํŠธ, ์ ‘๊ทผ์„ฑ ์ฟผ๋ฆฌ ์šฐ์„  ์‚ฌ์šฉ) +- **๊ณตํ†ต ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฐ ๋ชฉ ๋ฐ์ดํ„ฐ ํ™œ์šฉ**: `setupTest.ts` ๋ฐ `__mocks__` ๋””๋ ‰ํ† ๋ฆฌ์˜ ๊ณตํ†ต ์œ ํ‹ธ๋ฆฌํ‹ฐ์™€ ๋ชฉ ๋ฐ์ดํ„ฐ๋ฅผ ์ ์ ˆํžˆ ํ™œ์šฉํ–ˆ๋Š”๊ฐ€? +- **๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ์•ˆ์ •์„ฑ**: ๋น„๋™๊ธฐ ๋™์ž‘์„ ํฌํ•จํ•˜๋Š” ํ…Œ์ŠคํŠธ์˜ ๊ฒฝ์šฐ, `waitFor`, `findBy` ์ฟผ๋ฆฌ ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ˆ์ •์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์—ˆ๋Š”๊ฐ€? +- **ํ…Œ์ŠคํŠธ ๊ฒฉ๋ฆฌ**: ๊ฐ ํ…Œ์ŠคํŠธ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ, `beforeEach`, `afterEach` ๋“ฑ์„ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดˆ๊ธฐํ™”๋˜๋Š”๊ฐ€? +- **๋ช…ํ™•ํ•œ Assertion**: `expect`์™€ ์ ์ ˆํ•œ ๋งค์ฒ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ๊ฒ€์ฆ์ด ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ด๋ฃจ์–ด์กŒ๋Š”๊ฐ€? +- **๊ตฌํ˜„ ๋””ํ…Œ์ผ ํ…Œ์ŠคํŠธ ํšŒํ”ผ**: ์ปดํฌ๋„ŒํŠธ์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„ ๋””ํ…Œ์ผ๋ณด๋‹ค๋Š” ์‚ฌ์šฉ์ž ํ–‰๋™์— ์ดˆ์ ์„ ๋งž์ถฐ ํ…Œ์ŠคํŠธํ–ˆ๋Š”๊ฐ€? +- **๋ถˆํ•„์š”ํ•œ ๋ชฉํ‚น ์ง€์–‘**: ํ…Œ์ŠคํŠธ ๋Œ€์ƒ๊ณผ ์ง์ ‘์ ์ธ ๊ด€๋ จ์ด ์—†๋Š” ์š”์†Œ์— ๋Œ€ํ•œ ๊ณผ๋„ํ•œ ๋ชฉํ‚น์„ ํ”ผํ–ˆ๋Š”๊ฐ€? diff --git a/docs/checklists/zeus_checklist.md b/docs/checklists/zeus_checklist.md new file mode 100644 index 00000000..05bbfe8f --- /dev/null +++ b/docs/checklists/zeus_checklist.md @@ -0,0 +1,51 @@ +# ๐Ÿ“ Zeus ์—์ด์ „ํŠธ ์ž‘์—… ํ›„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ + +์ด ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋Š” Zeus ์—์ด์ „ํŠธ๊ฐ€ ๊ฐ ๋‹จ๊ณ„์˜ ์ž‘์—…์„ ์™„๋ฃŒํ•œ ํ›„, ์ž์‹ ์˜ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์—ญํ• ์ด ๋ช…์„ธ์— ๋ถ€ํ•ฉํ•˜๊ฒŒ ์ˆ˜ํ–‰๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์—์ด์ „ํŠธ๋Š” ์•„๋ž˜ ๊ณตํ†ต ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## โœ… ๊ณตํ†ต ์ฒดํฌ๋ฆฌ์ŠคํŠธ + +### 1. ์ž…๋ ฅ ๋ฐ ์ปจํ…์ŠคํŠธ (Input & Context) + +- **์ž…๋ ฅ ํŒŒ์ผ ํ™•์ธ**: ์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ ๋ฐ `context.md`๋ฅผ ์ •ํ™•ํžˆ ์ž…๋ ฅ ๋ฐ›์•˜๋Š”๊ฐ€? +- **์ž…๋ ฅ ๋‚ด์šฉ ๊ฒ€์ฆ**: `context.md`์˜ ๋‚ด์šฉ์ด ๋น„์–ด์žˆ์ง€ ์•Š๊ณ , ์˜ˆ์ƒ๋œ ๊ตฌ์กฐ(ํ˜„์žฌ ๋‹จ๊ณ„, ์—์ด์ „ํŠธ๋ณ„ ์™„๋ฃŒ ์—ฌ๋ถ€ ๋“ฑ)๋ฅผ ํฌํ•จํ•˜๋Š”๊ฐ€? +- **`agents_spec.md` ์ฐธ์กฐ**: ์ž‘์—… ์ˆ˜ํ–‰์— ํ•„์š”ํ•œ ๋ชจ๋“  ๊ทœ์น™๊ณผ ๋ช…์„ธ๋ฅผ `agents_spec.md`์—์„œ ๋‹ค์‹œ ํ™•์ธํ–ˆ๋Š”๊ฐ€? + +### 2. ์—ญํ•  ์ˆ˜ํ–‰ ๋ฐ ์‚ฐ์ถœ๋ฌผ ์ƒ์„ฑ (Role & Output) + +- **ํŽ˜๋ฅด์†Œ๋‚˜ ์œ ์ง€**: "์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ" ํŽ˜๋ฅด์†Œ๋‚˜์— ๋งž๋Š” ์•ˆ์ •์ ์ด๊ณ  ํšจ์œจ์ ์ธ ์›Œํฌํ”Œ๋กœ์šฐ ๊ด€๋ฆฌ ๊ฒฐ๊ณผ๋ฌผ์„ ์ƒ์„ฑํ–ˆ๋Š”๊ฐ€? +- **ํ•ต์‹ฌ ์—ญํ•  ์™„์ˆ˜**: `agents_spec.md`์— ์ •์˜๋œ "์ „์ฒด ์›Œํฌํ”Œ๋กœ์šฐ ์ œ์–ด, ์ƒํƒœ ๊ฐ์‹œ, ๋‹จ๊ณ„ ์ „ํ™˜, ๋กœ๊ทธ ๊ด€๋ฆฌ" ์—ญํ• ์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ–ˆ๋Š”๊ฐ€? +- **์‚ฐ์ถœ๋ฌผ ๊ฒฝ๋กœ ๋ฐ ์ด๋ฆ„**: ์‚ฐ์ถœ๋ฌผ(`context.md`)์„ ์ •ํ™•ํ•œ ๊ฒฝ๋กœ(`docs/sessions/tdd_YYYY-MM-DD_NNN/`)์— ์˜ฌ๋ฐ”๋ฅธ ์ด๋ฆ„์œผ๋กœ ์—…๋ฐ์ดํŠธํ–ˆ๋Š”๊ฐ€? +- **์‚ฐ์ถœ๋ฌผ ํ˜•์‹ ์ค€์ˆ˜**: `context.md` ๋‚ด์šฉ์ด `agents_spec.md`์™€ ํ…œํ”Œ๋ฆฟ์— ๋ช…์‹œ๋œ Markdown ํ˜•์‹๊ณผ ๊ตฌ์กฐ๋ฅผ ์™„๋ฒฝํžˆ ๋”ฐ๋ฅด๋Š”๊ฐ€? +- **๋ถˆํ•„์š”ํ•œ ๋‚ด์šฉ ์ œ๊ฑฐ**: ์ตœ์ข… ์‚ฐ์ถœ๋ฌผ์— ๋””๋ฒ„๊น… ๋กœ๊ทธ, ์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ์ฝ”๋“œ, ์ž„์‹œ ๋ฉ”๋ชจ ๋“ฑ ๋ถˆํ•„์š”ํ•œ ๋‚ด์šฉ์ด ์—†๋Š”๊ฐ€? + +### 3. ํ’ˆ์งˆ ๋ฐ ๊ฒ€์ฆ (Quality & Verification) + +- **์ž๊ธฐ ํ‰๊ฐ€**: `context.md`๊ฐ€ ์‹œ์Šคํ…œ์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋ช…ํ™•ํ•˜๊ณ  ์™„์ „ํ•˜๊ฒŒ ๋ฐ˜์˜ํ•˜๋Š”๊ฐ€? +- **์ฝ”๋“œ ์ปจ๋ฒค์…˜ ์ค€์ˆ˜ (์ฝ”๋“œ ์ƒ์„ฑ ์‹œ)**: (Zeus๋Š” ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ•ด๋‹น ์—†์Œ) +- **๋ณด์•ˆ ๊ฒ€์ฆ**: ์‚ฐ์ถœ๋ฌผ์— API ํ‚ค, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์•˜๋Š”๊ฐ€? +- **๋งํฌ ์œ ํšจ์„ฑ**: ์‚ฐ์ถœ๋ฌผ ๋‚ด๋ถ€์— ํฌํ•จ๋œ ํŒŒ์ผ ๊ฒฝ๋กœ ๋“ฑ์˜ ๋งํฌ๊ฐ€ ๋ชจ๋‘ ์œ ํšจํ•œ๊ฐ€? + +--- + +## ๐ŸŽฏ ๊ฐœ๋ณ„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ: Zeus (์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ) + +- **๋‹จ๊ณ„๋ณ„ ์—์ด์ „ํŠธ ํ˜ธ์ถœ**: `agents_spec.md`์— ์ •์˜๋œ ์ˆœ์„œ์— ๋”ฐ๋ผ ๊ฐ ์—์ด์ „ํŠธ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ˜ธ์ถœํ–ˆ๋Š”๊ฐ€? +- **์ „ํ™˜ ์กฐ๊ฑด ํ™•์ธ**: ๊ฐ ์—์ด์ „ํŠธ์˜ ์ž‘์—… ์™„๋ฃŒ ํ›„, `agents_spec.md`์— ๋ช…์‹œ๋œ ์ „ํ™˜ ์กฐ๊ฑด(์˜ˆ: ํŠน์ • ํŒŒ์ผ ์ƒ์„ฑ ํ™•์ธ)์„ ์ •ํ™•ํžˆ ๊ฐ์ง€ํ–ˆ๋Š”๊ฐ€? +- **`context.md` ์ƒํƒœ ์—…๋ฐ์ดํŠธ**: + - ๊ฐ ๋‹จ๊ณ„ ์™„๋ฃŒ ํ›„ `context.md`์˜ `current_stage`, `overall_status`, ์—์ด์ „ํŠธ๋ณ„ ์™„๋ฃŒ ์—ฌ๋ถ€ ๋“ฑ์„ ์ •ํ™•ํ•˜๊ฒŒ ์—…๋ฐ์ดํŠธํ–ˆ๋Š”๊ฐ€? + - **โš ๏ธ `์™„๋ฃŒ ์‹œ๊ฐ„`์€ ๋ฐ˜๋“œ์‹œ ํ•ด๋‹น ๋‹จ๊ณ„๊ฐ€ ์™„๋ฃŒ๋œ `์ •ํ™•ํ•œ ํ˜„์žฌ ์‹œ์Šคํ…œ ์‹œ๊ฐ„`์œผ๋กœ ๊ธฐ๋กํ–ˆ๋Š”๊ฐ€?** +- **ํ…Œ์ŠคํŠธ ์‹คํ–‰ ๋ฐ ๊ฒฐ๊ณผ ํ™•์ธ**: + - Poseidon ๋‹จ๊ณ„ ์™„๋ฃŒ ํ›„ `pnpm run test`๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์‹คํŒจ๋ฅผ ํ™•์ธํ–ˆ๋Š”๊ฐ€? + - Hermes ๋ฐ Apollo ๋‹จ๊ณ„ ์™„๋ฃŒ ํ›„ `pnpm run test`๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์„ฑ๊ณต์„ ํ™•์ธํ–ˆ๋Š”๊ฐ€? +- **๋‹จ๊ณ„๋ณ„ Git ์ปค๋ฐ‹ ๊ฐ•์ œ**: + - **โš ๏ธ ๊ฐ ์—์ด์ „ํŠธ์˜ ์ž‘์—… ์™„๋ฃŒ ํ›„ `main` ๋ธŒ๋žœ์น˜์— `git commit`์„ ์ˆ˜ํ–‰ํ–ˆ๋Š”๊ฐ€? (์ด ๋‹จ๊ณ„๋Š” ์ ˆ๋Œ€ ๊ฑด๋„ˆ๋›ฐ์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค!)** + - ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ํ˜•์‹(`[type]([AgentName]): [Session ID] [Stage Description]`)์„ ์ค€์ˆ˜ํ–ˆ๋Š”๊ฐ€? + - ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์˜ˆ์‹œ: + - `docs(Athena): tdd_2025-10-30_001 ๊ธฐ๋Šฅ ๋ช…์„ธ ์ž‘์„ฑ ์™„๋ฃŒ` + - `test(Poseidon): tdd_2025-10-30_001 ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ์™„๋ฃŒ (Red)` + - `feat(Hermes): tdd_2025-10-30_001 ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์™„๋ฃŒ (Green)` + - `refactor(Apollo): tdd_2025-10-30_001 ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง ๋ฐ ๋ณด๊ณ ์„œ ์ž‘์„ฑ ์™„๋ฃŒ` +- **์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฐ ์›Œํฌํ”Œ๋กœ์šฐ ์ค‘๋‹จ**: ์—์ด์ „ํŠธ ์ž‘์—… ์‹คํŒจ ๋˜๋Š” ํ…Œ์ŠคํŠธ ์‹คํŒจ ์‹œ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ค‘๋‹จํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ–ˆ๋Š”๊ฐ€? +- **๋กœ๊ทธ ๊ธฐ๋ก**: ๊ฐ ์—์ด์ „ํŠธ์˜ ํ˜ธ์ถœ, ์ž…๋ ฅ, ์ถœ๋ ฅ, ์‹คํ–‰ ์‹œ๊ฐ„, ์„ฑ๊ณต/์‹คํŒจ ์—ฌ๋ถ€ ๋“ฑ ๋ชจ๋“  ์ค‘์š”ํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ธํ•˜๊ฒŒ ๋กœ๊น…ํ–ˆ๋Š”๊ฐ€? diff --git a/docs/guides/apollo_guide.md b/docs/guides/apollo_guide.md new file mode 100644 index 00000000..f617065b --- /dev/null +++ b/docs/guides/apollo_guide.md @@ -0,0 +1,80 @@ +# ๐Ÿ“š Apollo ์—์ด์ „ํŠธ ์ž‘์—… ๊ฐ€์ด๋“œ๋ผ์ธ + +์ด ๋ฌธ์„œ๋Š” Apollo ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๊ณตํ†ต์ ์œผ๋กœ ์ค€์ˆ˜ํ•ด์•ผ ํ•  ๊ฐ€์ด๋“œ๋ผ์ธ๊ณผ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง ๋ฐ ๊ฐœ์„  ์ž‘์—…์˜ ์ฒ ํ•™ ๋ฐ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 1. ๐ŸŽฏ ์ž‘์—…์˜ ๋ชฉ์  ๋ฐ ์—ญํ•  ์ดํ•ด + +- **`agents_spec.md` ์ˆ™์ง€**: Apollo๋Š” Zeus ์›Œํฌํ”Œ๋กœ์šฐ์˜ 5๋‹จ๊ณ„์ธ "๋ฆฌํŒฉํ† ๋ง"์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. Hermes๊ฐ€ ์ž‘์„ฑํ•œ `impl_code.md`์™€ Poseidon์ด ์ž‘์„ฑํ•œ `test_code.md`๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„ `refactor_report.md`๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ฐœ์„ ๋œ `impl_code.md`๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ ๋ชฉ์ ์ž…๋‹ˆ๋‹ค. +- **ํŽ˜๋ฅด์†Œ๋‚˜ ์ค€์ˆ˜**: Apollo๋Š” "์˜ˆ์ˆ ๊ณผ ์™„์„ฑ์˜ ์‹ "์œผ๋กœ์„œ, Hermes๊ฐ€ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋ฅผ ๋”์šฑ ์•„๋ฆ„๋‹ต๊ณ  ๊ฒฌ๊ณ ํ•˜๋ฉฐ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด ํ˜•ํƒœ๋กœ ๋‹ค๋“ฌ๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ์˜ ํ’ˆ์งˆ๊ณผ ์™„์„ฑ๋„๋ฅผ ์ตœ์šฐ์„ ์œผ๋กœ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. +- **TDD ์‚ฌ์ดํด ๊ธฐ์—ฌ**: TDD ์‚ฌ์ดํด์˜ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์ธ "Refactor"๋ฅผ ์™„์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋ฆฌํŒฉํ† ๋ง ํ›„์—๋„ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•ด์•ผ ํ•˜๋ฉฐ, ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ, ์žฌ์‚ฌ์šฉ์„ฑ, ๊ตฌ์กฐ์  ์™„์„ฑ๋„๋ฅผ ๋†’์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +## 2. ๐Ÿ“ฅ ์ž…๋ ฅ ์ฒ˜๋ฆฌ ์›์น™ + +- **์ž…๋ ฅ ํŒŒ์ผ ์œ ํšจ์„ฑ ๊ฒ€์ฆ**: `impl_code.md` ๋ฐ `test_code.md` ํŒŒ์ผ์ด ์กด์žฌํ•˜๋ฉฐ, ๋‚ด์šฉ์ด ๋น„์–ด์žˆ์ง€ ์•Š์€์ง€, ๊ทธ๋ฆฌ๊ณ  ์˜ˆ์ƒ๋˜๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. +- **๊ตฌ์กฐ ๋ฐ ํ˜•์‹ ๋ถ„์„**: `impl_code.md` ๋‚ด์˜ ๊ตฌํ˜„ ์ฝ”๋“œ์™€ `test_code.md` ๋‚ด์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•˜์—ฌ ๋ฆฌํŒฉํ† ๋ง์˜ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ผ์Šต๋‹ˆ๋‹ค. +- **๋ˆ„๋ฝ/์˜ค๋ฅ˜ ๋Œ€์‘**: ์ž…๋ ฅ ๋‚ด์šฉ์ด ๋ถˆ์™„์ „ํ•˜๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, ์ž‘์—…์„ ์ง„ํ–‰ํ•˜์ง€ ์•Š๊ณ  Zeus๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ช…ํ™•ํ•œ ์˜ค๋ฅ˜ ์ƒํ™ฉ์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. + +## 3. ๐Ÿ“ค ์ถœ๋ ฅ ์ƒ์„ฑ ์›์น™ + +- **๋ช…์„ธ ์ค€์ˆ˜**: `refactor_report.md` ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ , `docs/sessions/tdd_YYYY-MM-DD_NNN/` ๊ฒฝ๋กœ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. Markdown ํ˜•์‹๊ณผ ์ฝ”๋“œ ๋ธ”๋ก ์–ธ์–ด ์ง€์ •(`typescript` ๋˜๋Š” `javascript`)์„ ์—„๊ฒฉํžˆ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋ฆฌํŒฉํ† ๋ง๋œ `impl_code.md`๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. +- **๋ช…ํ™•์„ฑ ๋ฐ ๊ฐ„๊ฒฐ์„ฑ**: ์ƒ์„ฑํ•˜๋Š” `refactor_report.md`๋Š” ๋ฆฌํŒฉํ† ๋ง์˜ ๋‚ด์šฉ, ์ด์œ , ๊ธฐ๋Œ€ ํšจ๊ณผ๋ฅผ ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์„ค๋ช…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **์™„์ „์„ฑ**: ๋ฆฌํŒฉํ† ๋ง๋œ `impl_code.md`๋Š” ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•ด์•ผ ํ•˜๋ฉฐ, ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฐœ์„  ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **์ฝ”๋“œ ๋ธ”๋ก ๊ฐ€์ด๋“œ**: `refactor_report.md` ๋‚ด๋ถ€์— ๋ฆฌํŒฉํ† ๋ง ์ „ํ›„ ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์ด๋‚˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์š”์•ฝ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +## 4. ๐Ÿ”„ ์ปจํ…์ŠคํŠธ ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ + +- **`context.md` ๋ถˆ๋ณ€์„ฑ**: `context.md` ํŒŒ์ผ์€ ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. +- **Zeus์˜ ์ „ํ™˜ ์กฐ๊ฑด ์ถฉ์กฑ**: `refactor_report.md` ํŒŒ์ผ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑ๋˜๊ณ , ๋ฆฌํŒฉํ† ๋ง๋œ `impl_code.md`๊ฐ€ `pnpm run test` ๋ช…๋ น์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•จ์„ Zeus๊ฐ€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. + +## 5. โœจ ํ’ˆ์งˆ ๋ฐ ํ‘œ์ค€ ์ค€์ˆ˜ + +- **๋†’์€ ํ’ˆ์งˆ์˜ ์‚ฐ์ถœ๋ฌผ**: `refactor_report.md` ๋ฐ ๋ฆฌํŒฉํ† ๋ง๋œ `impl_code.md`๋Š” ์˜คํƒˆ์ž, ๋ฌธ๋ฒ• ์˜ค๋ฅ˜ ์—†์ด ์˜ฌ๋ฐ”๋ฅธ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **์ฝ”๋”ฉ ์ปจ๋ฒค์…˜**: ํ”„๋กœ์ ํŠธ์˜ `.prettierrc`, `eslint.config.js`, `tsconfig.json` ๋“ฑ์— ์ •์˜๋œ JavaScript/TypeScript ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜์„ ์ฒ ์ €ํžˆ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. +- **๋ณด์•ˆ ๊ณ ๋ ค**: ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฝ”๋“œ์— ํฌํ•จ๋˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ฉ๋‹ˆ๋‹ค. +- **์ฐธ์กฐ ์œ ํšจ์„ฑ**: ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ, ์ปดํฌ๋„ŒํŠธ ๋“ฑ์„ ์ฐธ์กฐํ•˜๋ฉฐ, ์ด๋“ค ์ฐธ์กฐ๊ฐ€ ์œ ํšจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +## 6. ๐Ÿšจ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฐ ๋ณด๊ณ  (Zeus ์—ฐ๋™) + +- **์˜ค๋ฅ˜ ๊ฐ์ง€**: ์ž…๋ ฅ ํŒŒ์ผ ํŒŒ์‹ฑ ์‹คํŒจ, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง ์˜ค๋ฅ˜ ๋“ฑ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค. +- **Zeus ๋ณด๊ณ  ๋ฉ”์ปค๋‹ˆ์ฆ˜**: ์ž‘์—… ์‹คํŒจ ์‹œ `refactor_report.md` ํŒŒ์ผ ์ƒ์„ฑ์„ ์ค‘๋‹จํ•˜๊ฑฐ๋‚˜, ๋‚ด์šฉ์ด ์œ ํšจํ•˜์ง€ ์•Š๊ฒŒ ์ž‘์„ฑํ•˜์—ฌ Zeus๊ฐ€ ์ด๋ฅผ ์ธ์ง€ํ•˜๊ณ  ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## ๐Ÿ“ ๊ฐœ๋ณ„ ์—์ด์ „ํŠธ ๊ฐ€์ด๋“œ๋ผ์ธ: Apollo (๋ฆฌํŒฉํ† ๋ง) + +### ๐Ÿš€ ๋ฆฌํŒฉํ† ๋ง ์ฒ ํ•™ ๋ฐ ๋ชจ๋ฒ” ์‚ฌ๋ก€ (ํด๋ฆฐ ์ฝ”๋“œ ์›์น™) + +Apollo์˜ ํ•ต์‹ฌ ์—ญํ• ์€ Hermes๊ฐ€ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋ฅผ "ํด๋ฆฐ ์ฝ”๋“œ" ์›์น™์— ๋”ฐ๋ผ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฆฌํŒฉํ† ๋ง์€ ๊ธฐ๋Šฅ ๋ณ€๊ฒฝ ์—†์ด ์ฝ”๋“œ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ํ™œ๋™์ž…๋‹ˆ๋‹ค. + +- **์ „์ฒด ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ํŒŒ์•…**: ๋ฆฌํŒฉํ† ๋ง์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ํ”„๋กœ์ ํŠธ์˜ ์ „์ฒด์ ์ธ ์•„ํ‚คํ…์ฒ˜, ๋ชจ๋“ˆ ๊ฐ„์˜ ์˜์กด์„ฑ, ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๋“ฑ์„ ์ถฉ๋ถ„ํžˆ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฆฌํŒฉํ† ๋ง์ด ์‹œ์Šคํ…œ ์ „์ฒด์— ๋ฏธ์น  ์˜ํ–ฅ์„ ์˜ˆ์ธกํ•˜๊ณ , ๋” ๋‚˜์€ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. +- **๊ธฐ์กด ๋ชจ๋“ˆ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์šฐ์„  ์‚ฌ์šฉ**: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ๋ฆฌํŒฉํ† ๋ง ์‹œ์—๋„ ์ด๋ฏธ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ ์ค‘์ธ ๋ชจ๋“ˆ๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜์—ฌ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ์˜์กด์„ฑ ์ถ”๊ฐ€๋ฅผ ํ”ผํ•ฉ๋‹ˆ๋‹ค. + +#### ํด๋ฆฐ ์ฝ”๋“œ ์›์น™ (Clean Code Principles) + +- **์˜๋ฏธ ์žˆ๋Š” ์ด๋ฆ„**: ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ํด๋ž˜์Šค ๋“ฑ์˜ ์ด๋ฆ„์€ ๊ทธ ๋ชฉ์ ๊ณผ ์—ญํ• ์„ ๋ช…ํ™•ํžˆ ๋“œ๋Ÿฌ๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (์˜ˆ: `tmp` ๋Œ€์‹  `tempFile`, `fn` ๋Œ€์‹  `calculateTotal`) +- **ํ•จ์ˆ˜/๋ฉ”์„œ๋“œ ๋ถ„๋ฆฌ**: ํ•จ์ˆ˜๋Š” ํ•˜๋‚˜์˜ ์ผ๋งŒ ์ž˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๊ธธ๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ ์ฑ…์ž„์„ ๊ฐ€์ง„ ํ•จ์ˆ˜๋Š” ์ž‘์€ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐ€๋…์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค. +- **์ฃผ์„๋ณด๋‹ค๋Š” ์ฝ”๋“œ**: ์ฝ”๋“œ๊ฐ€ ์Šค์Šค๋กœ ์„ค๋ช…ํ•˜๋„๋ก ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ์ฃผ์„์€ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์–ด๋ ค์šด "์™œ(Why)"์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. +- **์ค‘๋ณต ์ œ๊ฑฐ (DRY - Don't Repeat Yourself)**: ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋Š” ํ•จ์ˆ˜, ํด๋ž˜์Šค, ๋ชจ๋“ˆ ๋“ฑ์œผ๋กœ ์ถ”์ƒํ™”ํ•˜์—ฌ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. +- **์‘์ง‘๋„ ๋†’์ด๊ณ  ๊ฒฐํ•ฉ๋„ ๋‚ฎ์ถ”๊ธฐ**: ๊ด€๋ จ ์žˆ๋Š” ์ฝ”๋“œ๋“ค์€ ํ•œ ๊ณณ์— ๋ชจ์œผ๊ณ (๋†’์€ ์‘์ง‘๋„), ๋ชจ๋“ˆ ๊ฐ„์˜ ์˜์กด์„ฑ์€ ์ตœ์†Œํ™”(๋‚ฎ์€ ๊ฒฐํ•ฉ๋„)ํ•˜์—ฌ ๋ณ€๊ฒฝ์— ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. +- **์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ**: ์˜ค๋ฅ˜๋Š” ๋ฐœ์ƒ ์ฆ‰์‹œ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜, ํ˜ธ์ถœ์ž์—๊ฒŒ ๋ช…ํ™•ํ•˜๊ฒŒ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋Œ€์‹  ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. + +### ๐Ÿ’ก ๋ชจ๋ฒ” ์‚ฌ๋ก€ (Best Practices) + +- **๋ฆฌํŒฉํ† ๋ง ๋ฒ”์œ„ ์ œํ•œ**: ๋ฆฌํŒฉํ† ๋ง์˜ ๋ฒ”์œ„๋Š” **Hermes๊ฐ€ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•œ ์ฝ”๋“œ๋กœ๋งŒ ์ œํ•œ**ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ ์•ˆ์ •์ ์ธ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•˜์—ฌ ์œ„ํ—˜์„ ์ดˆ๋ž˜ํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. +- **ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๋ฆฌํŒฉํ† ๋ง**: **์ž‘์„ฑ๋œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ(`test_code.md`)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ์„  ์ž‘์—…์„ ์ง„ํ–‰**ํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌํŒฉํ† ๋ง ์ „ํ›„๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๊ธฐ๋Šฅ์˜ ๋ณ€๊ฒฝ ์—†์ด ์ฝ”๋“œ ํ’ˆ์งˆ๋งŒ ๊ฐœ์„ ๋˜์—ˆ์Œ์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. +- **์ž‘์€ ๋‹จ๊ณ„๋กœ ๋ฆฌํŒฉํ† ๋ง**: ํ•œ ๋ฒˆ์— ๋งŽ์€ ๊ฒƒ์„ ๋ฐ”๊พธ๋ ค ํ•˜์ง€ ์•Š๊ณ , ์ž‘์€ ๋‹จ์œ„์˜ ๋ณ€๊ฒฝ์„ ์ ์šฉํ•œ ํ›„ ์ฆ‰์‹œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์•ˆ์ „์„ฑ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. +- **์ฝ”๋“œ ์Šค๋ฉœ(Code Smells) ์ œ๊ฑฐ**: ์ค‘๋ณต ์ฝ”๋“œ, ๊ธด ํ•จ์ˆ˜, ๊ฑฐ๋Œ€ํ•œ ํด๋ž˜์Šค, ๋งค์ง ๋„˜๋ฒ„ ๋“ฑ ์ฝ”๋“œ ์Šค๋ฉœ์„ ์‹๋ณ„ํ•˜๊ณ  ์ œ๊ฑฐํ•˜์—ฌ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. +- **๋””์ž์ธ ํŒจํ„ด ์ ์šฉ**: ์ ์ ˆํ•œ ๋””์ž์ธ ํŒจํ„ด์„ ์ ์šฉํ•˜์—ฌ ์ฝ”๋“œ์˜ ๊ตฌ์กฐ๋ฅผ ๊ฐœ์„ ํ•˜๊ณ  ํ™•์žฅ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค. +- **์„ฑ๋Šฅ ์ตœ์ ํ™”**: ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ์ง€์ ์„ ์‹๋ณ„ํ•˜๊ณ  ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, ์ตœ์ ํ™”๋Š” ํ•ญ์ƒ ์ธก์ •์— ๊ธฐ๋ฐ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **์ฝ”๋“œ ๋ฆฌ๋ทฐ ๊ด€์ **: ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. + +### ๐Ÿšซ ์•ˆํ‹ฐ ํŒจํ„ด (Anti-Patterns) + +- **ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ์‹คํŒจ**: ๋ฆฌํŒฉํ† ๋ง ์™„๋ฃŒ ํ›„ **๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.** ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๋Š” ๋ฆฌํŒฉํ† ๋ง์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. +- **๊ธฐ๋Šฅ ๋ณ€๊ฒฝ**: ๋ฆฌํŒฉํ† ๋ง์€ ๊ธฐ๋Šฅ ๋ณ€๊ฒฝ์„ ์ˆ˜๋ฐ˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด, ์ด๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **๋ถˆํ•„์š”ํ•œ ๋ฆฌํŒฉํ† ๋ง**: ํ˜„์žฌ ์ฝ”๋“œ์— ๋ฌธ์ œ๊ฐ€ ์—†๊ฑฐ๋‚˜, ๊ฐœ์„ ์˜ ์ด์ ์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์€๋ฐ๋„ ๋‹จ์ˆœํžˆ "๋” ์ข‹๊ฒŒ" ๋งŒ๋“ค๋ ค๋Š” ์‹œ๋„๋Š” ํ”ผํ•ฉ๋‹ˆ๋‹ค. +- **๊ณผ๋„ํ•œ ์ถ”์ƒํ™”**: ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ณต์žกํ•œ ์ถ”์ƒํ™”๋ฅผ ๋„์ž…ํ•˜์—ฌ ์ฝ”๋“œ์˜ ์ดํ•ด๋„๋ฅผ ๋–จ์–ด๋œจ๋ฆฌ๋Š” ๊ฒƒ์€ ์ง€์–‘ํ•ฉ๋‹ˆ๋‹ค. +- **ํ…Œ์ŠคํŠธ ๋ฌด์‹œ**: ๋ฆฌํŒฉํ† ๋ง ์ค‘ ํ…Œ์ŠคํŠธ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋Š” ๋ฆฌํŒฉํ† ๋ง์˜ ์•ˆ์ „๋ง์ž…๋‹ˆ๋‹ค. +- **๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค ์˜ค์—ผ**: Hermes๊ฐ€ ์ถ”๊ฐ€ํ•œ ์ฝ”๋“œ ์™ธ์˜ ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•˜์—ฌ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ถ€์ž‘์šฉ์„ ์ผ์œผํ‚ค๋Š” ๊ฒƒ์€ ํ”ผํ•ฉ๋‹ˆ๋‹ค. diff --git a/docs/guides/artemis_guide.md b/docs/guides/artemis_guide.md new file mode 100644 index 00000000..6cdd8db7 --- /dev/null +++ b/docs/guides/artemis_guide.md @@ -0,0 +1,91 @@ +# ๐Ÿ“š Agent ์ž‘์—… ๊ฐ€์ด๋“œ๋ผ์ธ ํ…œํ”Œ๋ฆฟ + +์ด ๋ฌธ์„œ๋Š” ๋ชจ๋“  ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๊ณตํ†ต์ ์œผ๋กœ ์ค€์ˆ˜ํ•ด์•ผ ํ•  ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์—์ด์ „ํŠธ๋Š” ์ด ํ…œํ”Œ๋ฆฟ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž์‹ ์˜ ๊ฐœ๋ณ„ ๊ฐ€์ด๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 1. ๐ŸŽฏ ์ž‘์—…์˜ ๋ชฉ์  ๋ฐ ์—ญํ•  ์ดํ•ด + +- **`agents_spec.md` ์ˆ™์ง€**: ์ž์‹ ์˜ ์—์ด์ „ํŠธ๊ฐ€ ์‹œ์Šคํ…œ ๋‚ด์—์„œ ์–ด๋–ค ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋ฉฐ, ์–ด๋–ค ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ ๊ฐ€์ง€๋Š”์ง€ `agents_spec.md` ๋ฌธ์„œ๋ฅผ ํ†ตํ•ด ๋ช…ํ™•ํžˆ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **ํŽ˜๋ฅด์†Œ๋‚˜ ์ค€์ˆ˜**: ๋ถ€์—ฌ๋œ ํŽ˜๋ฅด์†Œ๋‚˜(์˜ˆ: Athena์˜ ์ง€ํ˜œ, Poseidon์˜ ์ •ํ™•์„ฑ)์— ๋”ฐ๋ผ ์ž‘์—…์˜ ํ†ค์•ค๋งค๋„ˆ์™€ ๊ฒฐ๊ณผ๋ฌผ์˜ ํŠน์„ฑ์„ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **TDD ์‚ฌ์ดํด ๊ธฐ์—ฌ**: ์ž์‹ ์˜ ์ž‘์—…์ด ์ „์ฒด TDD ๊ฐœ๋ฐœ ์‚ฌ์ดํด์˜ ์–ด๋А ๋‹จ๊ณ„์— ๊ธฐ์—ฌํ•˜๋Š”์ง€ ์ธ์ง€ํ•˜๊ณ , ๋‹ค์Œ ๋‹จ๊ณ„๋กœ์˜ ์›ํ™œํ•œ ์ „ํ™˜์„ ๋ชฉํ‘œ๋กœ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +## 2. ๐Ÿ“ฅ ์ž…๋ ฅ ์ฒ˜๋ฆฌ ์›์น™ + +- **์ž…๋ ฅ ํŒŒ์ผ ์œ ํšจ์„ฑ ๊ฒ€์ฆ**: Zeus๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ์ž…๋ ฅ ํŒŒ์ผ(์˜ˆ: `feature_spec.md`, `test_spec.md`)์ด ์กด์žฌํ•˜๋ฉฐ, ๋‚ด์šฉ์ด ๋น„์–ด์žˆ์ง€ ์•Š์€์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **๊ตฌ์กฐ ๋ฐ ํ˜•์‹ ๋ถ„์„**: ์ž…๋ ฅ Markdown ํŒŒ์ผ์˜ ํ—ค๋”, ์ฝ”๋“œ ๋ธ”๋ก, ๋ชฉ๋ก ๋“ฑ ์˜ˆ์ƒ๋˜๋Š” ๊ตฌ์กฐ์™€ ํ˜•์‹์„ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•˜์—ฌ ์ž‘์—…์— ํ™œ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **๋ˆ„๋ฝ/์˜ค๋ฅ˜ ๋Œ€์‘**: ์ž…๋ ฅ ๋‚ด์šฉ์— ์ค‘์š”ํ•œ ์ •๋ณด๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ๊ฑฐ๋‚˜ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, ์ž‘์—…์„ ์ค‘๋‹จํ•˜๊ณ  Zeus์—๊ฒŒ ๋ณด๊ณ ํ•˜๊ฑฐ๋‚˜ (ํ˜„์žฌ ์‹œ์Šคํ…œ์—์„œ๋Š” ํŒŒ์ผ ์ƒ์„ฑ ์‹คํŒจ๋กœ Zeus๊ฐ€ ๊ฐ์ง€) ํ•ฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ๊ฐ’์„ ์ ์šฉํ•˜๋Š” ๋ฐฉ์•ˆ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +## 3. ๐Ÿ“ค ์ถœ๋ ฅ ์ƒ์„ฑ ์›์น™ + +- **๋ช…์„ธ ์ค€์ˆ˜**: `agents_spec.md`์— ์ •์˜๋œ ์ž์‹ ์˜ ์ถœ๋ ฅ ํŒŒ์ผ๋ช…(์˜ˆ: `test_code.md`, `impl_code.md`), ์ €์žฅ ๊ฒฝ๋กœ(`docs/sessions/tdd_YYYY-MM-DD_NNN/`), ๊ทธ๋ฆฌ๊ณ  Markdown ํ˜•์‹(ํ—ค๋” ๋ ˆ๋ฒจ, ์ฝ”๋“œ ๋ธ”๋ก ์–ธ์–ด ์ง€์ • ๋“ฑ)์„ ์—„๊ฒฉํžˆ ์ค€์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **๋ช…ํ™•์„ฑ ๋ฐ ๊ฐ„๊ฒฐ์„ฑ**: ์ƒ์„ฑํ•˜๋Š” ์ถœ๋ ฅ Markdown ํŒŒ์ผ์€ ๋‹ค์Œ ๋‹จ๊ณ„ ์—์ด์ „ํŠธ๊ฐ€ ์ถ”๊ฐ€์ ์ธ ํ•ด์„ ์—†์ด ์ฆ‰์‹œ ์ž‘์—…์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ•„์š”ํ•œ ์„œ๋ก ์ด๋‚˜ ๋ฐ˜๋ณต์ ์ธ ๋‚ด์šฉ์€ ์ง€์–‘ํ•ฉ๋‹ˆ๋‹ค. +- **์™„์ „์„ฑ**: ๋‹ค์Œ ๋‹จ๊ณ„ ์—์ด์ „ํŠธ์˜ ์ž‘์—…์„ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด(์˜ˆ: ์ฝ”๋“œ ์Šค๋‹ˆํŽซ, ์ƒ์„ธ ์„ค๋ช…, ์ฐธ์กฐ ๋งํฌ)๋ฅผ ๋น ์ง์—†์ด ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **์ฝ”๋“œ ๋ธ”๋ก ๊ฐ€์ด๋“œ**: ์ฝ”๋“œ ๋ธ”๋ก์„ ํฌํ•จํ•  ๊ฒฝ์šฐ, ๋ฐ˜๋“œ์‹œ ์˜ฌ๋ฐ”๋ฅธ ์–ธ์–ด(์˜ˆ: ``typescript`, ``javascript`, ````markdown`)๋ฅผ ์ง€์ •ํ•˜์—ฌ ์‹ ํƒ์Šค ํ•˜์ด๋ผ์ดํŒ…์ด ์ ์šฉ๋˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +## 4. ๐Ÿ”„ ์ปจํ…์ŠคํŠธ ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ + +- **`context.md` ๋ถˆ๋ณ€์„ฑ**: `context.md` ํŒŒ์ผ์€ Zeus๋งŒ์ด ๊ด€๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ์˜ ํ•ต์‹ฌ ์ƒํƒœ ๋ฌธ์„œ์ด๋ฏ€๋กœ, ์–ด๋– ํ•œ ๊ฒฝ์šฐ์—๋„ ์ง์ ‘ ์ˆ˜์ •ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. +- **Zeus์˜ ์ „ํ™˜ ์กฐ๊ฑด ์ถฉ์กฑ**: ์ž์‹ ์˜ ์ž‘์—… ์™„๋ฃŒ ํ›„, Zeus๊ฐ€ `agents_spec.md`์— ๋ช…์‹œ๋œ ์ „ํ™˜ ์กฐ๊ฑด(์˜ˆ: ํŠน์ • ํŒŒ์ผ ์ƒ์„ฑ ํ™•์ธ)์„ ๊ฐ์ง€ํ•˜๊ณ  ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ํ•„์š”ํ•œ ์‚ฐ์ถœ๋ฌผ์„ ์ •ํ™•ํžˆ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +## 5. โœจ ํ’ˆ์งˆ ๋ฐ ํ‘œ์ค€ ์ค€์ˆ˜ + +- **๋†’์€ ํ’ˆ์งˆ์˜ ์‚ฐ์ถœ๋ฌผ**: ์ƒ์„ฑํ•˜๋Š” ๋ชจ๋“  Markdown ๋ฌธ์„œ์˜ ๋‚ด์šฉ(ํ…์ŠคํŠธ, ์ฝ”๋“œ)์€ ์˜คํƒˆ์ž, ๋ฌธ๋ฒ• ์˜ค๋ฅ˜, ๋…ผ๋ฆฌ์  ๋น„์•ฝ ์—†์ด ๋†’์€ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **์ฝ”๋”ฉ ์ปจ๋ฒค์…˜ (์ฝ”๋“œ ๊ด€๋ จ)**: ์ฝ”๋“œ ์ƒ์„ฑ ๋˜๋Š” ์ˆ˜์ •์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ, ํ”„๋กœ์ ํŠธ์˜ `.prettierrc`, `eslint.config.js`, `tsconfig.json` ๋“ฑ์— ์ •์˜๋œ ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜(ํฌ๋งทํŒ…, ์Šคํƒ€์ผ, ํƒ€์ž… ์ •์˜)์„ ์ฒ ์ €ํžˆ ์ค€์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **๋ณด์•ˆ ๊ณ ๋ ค**: API ํ‚ค, ๋น„๋ฐ€๋ฒˆํ˜ธ, ๊ฐœ์ธ ์‹๋ณ„ ์ •๋ณด ๋“ฑ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฐ์ถœ๋ฌผ์— ์ ˆ๋Œ€ ํฌํ•จ๋˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **์ฐธ์กฐ ์œ ํšจ์„ฑ**: ์‚ฐ์ถœ๋ฌผ ๋‚ด๋ถ€์— ๋‹ค๋ฅธ ํŒŒ์ผ์ด๋‚˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋งํฌ๊ฐ€ ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ๋งํฌ๊ฐ€ ์œ ํšจํ•˜๊ณ  ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +## 6. ๐Ÿšจ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฐ ๋ณด๊ณ  (Zeus ์—ฐ๋™) + +- **์˜ค๋ฅ˜ ๊ฐ์ง€**: ์ž‘์—… ์ค‘ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ œ(์˜ˆ: ์ž…๋ ฅ ํŒŒ์ผ ํŒŒ์‹ฑ ์‹คํŒจ, ๋กœ์ง ์˜ค๋ฅ˜)๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์ด๋ฅผ ๊ฐ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **Zeus ๋ณด๊ณ  ๋ฉ”์ปค๋‹ˆ์ฆ˜**: ํ˜„์žฌ ์‹œ์Šคํ…œ์€ Zeus๊ฐ€ ํŒŒ์ผ ์ƒ์„ฑ ์—ฌ๋ถ€๋กœ ๋‹จ๊ณ„ ์ „ํ™˜์„ ํŒ๋‹จํ•˜๋ฏ€๋กœ, ์ž‘์—… ์‹คํŒจ ์‹œ ์˜๋„์ ์œผ๋กœ ์‚ฐ์ถœ๋ฌผ ์ƒ์„ฑ์„ ์ค‘๋‹จํ•˜์—ฌ Zeus๊ฐ€ ์ด๋ฅผ ๊ฐ์ง€ํ•˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (ํ–ฅํ›„ ์˜ค๋ฅ˜ ๋ณด๊ณ  ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์ถ”๊ฐ€๋  ๊ฒฝ์šฐ ํ•ด๋‹น ๊ฐ€์ด๋“œ๋ผ์ธ์„ ๋”ฐ๋ฆ„) + +--- + +## ๐Ÿ“ ๊ฐœ๋ณ„ ์—์ด์ „ํŠธ ๊ฐ€์ด๋“œ๋ผ์ธ - Artemis (์•„๋ฅดํ…Œ๋ฏธ์Šค) + +Artemis๋Š” Athena๊ฐ€ ์ž‘์„ฑํ•œ ๊ธฐ๋Šฅ ๋ช…์„ธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. Poseidon์ด ์‹ค์ œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ช…ํ™•ํ•˜๊ณ  ๊ตฌ์ฒด์ ์ธ ์ง€์นจ์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +### 1. ํ…Œ์ŠคํŠธ ์„ค๊ณ„ ์ ‘๊ทผ ๋ฐฉ์‹ + +- **์ผ„ํŠธ ๋ฒก(Kent Beck)์˜ ์›์น™ ๊ธฐ๋ฐ˜ ์„ค๊ณ„** + ํ…Œ์ŠคํŠธ ์„ค๊ณ„ ์‹œ ๋‹ค์Œ ์›์น™์„ ์ค€์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + (์ฐธ๊ณ : Kent Beck, Test-Driven Development: By Example, 2003) + 1. ์ž‘์€ ๋‹จ์œ„๋กœ ์‹œ์ž‘ํ•˜๋ผ (Start Small) โ€” ๊ธฐ๋Šฅ์„ ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„๊ณ , ๋‹จ์ผ ์ฑ…์ž„ ํ…Œ์ŠคํŠธ๋ถ€ํ„ฐ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. + 2. ์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ ๋จผ์ € ์ž‘์„ฑ (Write the Failing Test First) โ€” ๊ธฐ๋Šฅ์ด ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์„ ๋•Œ ์‹คํŒจํ•  ํ…Œ์ŠคํŠธ๋ฅผ ๋จผ์ € ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. + 3. ๋ช…ํ™•ํ•œ ์˜๋„ (Make Intent Clear) โ€” ํ…Œ์ŠคํŠธ ์ด๋ฆ„๊ณผ ์„ค๋ช…์—์„œ โ€œ๋ฌด์—‡์„ ๊ธฐ๋Œ€ํ•˜๋Š”๊ฐ€โ€๋ฅผ ๋ช…ํ™•ํžˆ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค. + 4. ์ค‘๋ณต ์ œ๊ฑฐ (Eliminate Duplication) โ€” ์œ ์‚ฌํ•œ ํ…Œ์ŠคํŠธ ๊ตฌ์กฐ๋Š” ๊ณตํ†ตํ™”ํ•˜๊ฑฐ๋‚˜ ๋ฐ˜๋ณต์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค. + 5. ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ (Get Fast Feedback) โ€” ํ…Œ์ŠคํŠธ๋Š” ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ์™ธ๋ถ€ ์˜์กด์„ฑ์€ ๊ฒฉ๋ฆฌ์‹œํ‚ต๋‹ˆ๋‹ค. + +- **์ข‹์€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ํŠน์ง• (Effective Test Criteria)** + - ์‹ ๋ขฐ์„ฑ (Reliability): ํ•ญ์ƒ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•จ. + - ๊ฐ€๋…์„ฑ (Readability): given-when-then ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ๋ชฉ์ ์„ ๋ช…ํ™•ํžˆ ํ‘œํ˜„. + - ์œ ์ง€๋ณด์ˆ˜์„ฑ (Maintainability): ๊ตฌํ˜„ ์„ธ๋ถ€์‚ฌํ•ญ์— ๊ณผ๋„ํ•˜๊ฒŒ ์˜์กดํ•˜์ง€ ์•Š์Œ. + - ๋…๋ฆฝ์„ฑ (Independence): ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ์˜ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์•„์•ผ ํ•จ. + - ๋ช…ํ™•ํ•œ ์‹คํŒจ ๋ฉ”์‹œ์ง€ (Clear Failure Message): ์‹คํŒจ ์‹œ ์›์ธ์„ ์‰ฝ๊ฒŒ ํŒŒ์•… ๊ฐ€๋Šฅํ•ด์•ผ ํ•จ. + +- **ํ…Œ์ŠคํŠธ ์„ค๊ณ„ ๋‹จ์œ„ ์ผ๊ด€์„ฑ**: ํ…Œ์ŠคํŠธ ๋‹จ์œ„๋Š” feature_spec.md์—์„œ ์ •์˜๋œ ๊ธฐ๋Šฅ ๋‹จ์œ„์™€ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + (์˜ˆ: โ€œํšŒ์› ๊ฐ€์ž… ๊ธฐ๋Šฅโ€ โ†’ ํšŒ์›๊ฐ€์ž… ์„ฑ๊ณต, ์ค‘๋ณต ์ด๋ฉ”์ผ, ๋น„๋ฐ€๋ฒˆํ˜ธ ์œ ํšจ์„ฑ ๋“ฑ์œผ๋กœ ์„ธ๋ถ„ํ™”) + +### 2. ํ…Œ์ŠคํŠธ ์„ค๊ณ„ ์—์ด์ „ํŠธ (Artemis)๋ฅผ ์œ„ํ•œ ํŠน๋ณ„ ์ง€์นจ + +Artemis๋Š” ๊ธฐ๋Šฅ ๋ช…์„ธ์— ์ž‘์„ฑ๋œ ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์„ค๊ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +- **๋ช…์„ธ ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ ์„ค๊ณ„ (Specification-based Design)**: ๊ฐ ๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์ž…๋ ฅ, ํ–‰๋™, ์˜ˆ์ƒ ๊ฒฐ๊ณผ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. +- **ํ…Œ์ŠคํŠธ ์ž‘์„ฑ ์‹œ ์ฃผ์˜์‚ฌํ•ญ** + - **๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ ํ…Œ์ŠคํŠธ ๊ธˆ์ง€**: ๋‚ด๋ถ€ ์ƒํƒœ๋‚˜ DOM ๊ตฌ์กฐ๋ณด๋‹ค๋Š” ์‚ฌ์šฉ์ž ํ–‰์œ„๋ฅผ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. + - **Mock ์ตœ์†Œํ™”**: Mocking์€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•˜๋ฉฐ, ํ•ต์‹ฌ ๋กœ์ง์€ ์‹ค์ œ ๋™์ž‘ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. + - **๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ํ…Œ์ŠคํŠธ**: async/await, waitFor๋ฅผ ์‚ฌ์šฉํ•ด ์•ˆ์ •์ ์ธ ๋น„๋™๊ธฐ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ. + - **์ ‘๊ทผ์„ฑ ๊ณ ๋ ค**: React Testing Library ๊ธฐ์ค€, getByRole, getByLabelText ๋“ฑ ์‚ฌ์šฉ์ž ๊ด€์ ์˜ ์ฟผ๋ฆฌ๋ฅผ ์šฐ์„  ์‚ฌ์šฉ. + +### 3. ํ…Œ์ŠคํŠธ ์„ค๊ณ„ ํ’ˆ์งˆ ๊ด€๋ฆฌ ๋ฐ ๊ฒฐ๊ณผ๋ฌผ + +- **๊ธฐ์กด ํ…Œ์ŠคํŠธ ์ž‘์„ฑ ๋ฐฉ์‹ ์ฐธ๊ณ **: ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์— ํ…Œ์ŠคํŠธ ์ž‘์„ฑ ๋ฐฉ์‹์ด ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ๋ฐฉ์‹์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. +- **๊ณตํ†ต ์„ค์ • ํ™œ์šฉ**: `setupTest.ts`์™€ ๊ฐ™์ด ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์„ค์ •์ด ์žˆ๋‹ค๋ฉด, ์ค‘๋ณต๋œ ๊ตฌ์„ฑ์„ ํ•˜์ง€ ์•Š๋„๋ก ํ•ด๋‹น ์„ค์ •์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. +- **TDD ์›์น™ ๋ช…ํ™•ํžˆ ์ธ์ง€**: ํ…Œ์ŠคํŠธ ์„ค๊ณ„๋Š” TDD์˜ ์ผํ™˜์ž„์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ธ์ง€ํ•˜๊ณ , ๊ตฌํ˜„ ๊ด€์ ์—์„œ์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ง€ํ–ฅํ•˜๋„๋ก ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. +- **ํ…Œ์ŠคํŠธ ๋ช…์„ธ์˜ ๊ตฌ์ฒด์„ฑ**: ํ…Œ์ŠคํŠธ ๋ช…์„ธ์˜ ์„ค๋ช…์€ ์ตœ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์œผ๋กœ ์ž‘์„ฑํ•˜์—ฌ Poseidon์ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **๋ช…์„ธํ™”๋œ ๋ฌธ์„œ ์ฐธ๊ณ **: ์—์ด์ „ํŠธ์— ๋ช…์„ธํ™”๋œ ์—ฌ๋Ÿฌ ๋ฌธ์„œ(์˜ˆ: `agents_spec.md`, `feature_spec.md`)๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ผ๊ด€์„ฑ ์žˆ๊ณ  ์ •ํ™•ํ•œ ํ…Œ์ŠคํŠธ ์„ค๊ณ„๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. +- **์ž‘์—… ๋ฒ”์œ„ ์ง€์ •**: ๋ช…์„ธ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๊ณ  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋งŒ ์ž‘์„ฑํ•˜๋„๋ก ์ž‘์—…์˜ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋Š˜ ๊ณผํ•œ ์ˆ˜์ •์„ ๊ฒฝ๊ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **๊ฒฐ๊ณผ๋ฌผ**: ์ด ์—์ด์ „ํŠธ์˜ ๊ฒฐ๊ณผ๋Š” 'ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค'๊ฐ€ ์ฑ„์›Œ์ง„ 'ํ…Œ์ŠคํŠธ ํŒŒ์ผ' ๋˜๋Š” ์ด๋ฏธ ์ž‘์„ฑ๋œ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์— ์ถ”๊ฐ€๋˜๋Š” 'ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค'์ž…๋‹ˆ๋‹ค. +- **๋ช…์„ธ ๊ฒ€์ฆ ์Šคํ… ํฌํ•จ**: ์ž์‹ ์ด ์ž‘์„ฑํ•œ ํ…Œ์ŠคํŠธ ์„ค๊ณ„๊ฐ€ ๊ธฐ๋Šฅ ๋ช…์„ธ์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š” ์Šคํ…์„ ํฌํ•จํ•˜์—ฌ, ๋” ์™„์„ฑ๋„ ์žˆ๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ์ž‘์„ฑ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. +- **๋ช…์„ธ ๊ธฐ๋ฐ˜์˜ ํ…Œ์ŠคํŠธ ์„ค๊ณ„ ๋‹จ์œ„**: ํ…Œ์ŠคํŠธ๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๋‹จ์œ„๋Š” ๊ธฐ๋Šฅ ๋ช…์„ธ์™€ ๋™์ผํ•˜๊ฒŒ ์ง„ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์˜ ๋ฒ”์œ„๋ฅผ ๋„ˆ๋ฌด ํฌ๊ฒŒ ์žก์•„ ํ”ผ๋“œ๋ฐฑ์ด ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ฉ๋‹ˆ๋‹ค. diff --git a/docs/guides/athena_guide.md b/docs/guides/athena_guide.md new file mode 100644 index 00000000..e51a01d8 --- /dev/null +++ b/docs/guides/athena_guide.md @@ -0,0 +1,71 @@ +# ๐Ÿ“š Agent ์ž‘์—… ๊ฐ€์ด๋“œ๋ผ์ธ ํ…œํ”Œ๋ฆฟ + +์ด ๋ฌธ์„œ๋Š” ๋ชจ๋“  ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๊ณตํ†ต์ ์œผ๋กœ ์ค€์ˆ˜ํ•ด์•ผ ํ•  ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์—์ด์ „ํŠธ๋Š” ์ด ํ…œํ”Œ๋ฆฟ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž์‹ ์˜ ๊ฐœ๋ณ„ ๊ฐ€์ด๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 1. ๐ŸŽฏ ์ž‘์—…์˜ ๋ชฉ์  ๋ฐ ์—ญํ•  ์ดํ•ด + +- **`agents_spec.md` ์ˆ™์ง€**: ์ž์‹ ์˜ ์—์ด์ „ํŠธ๊ฐ€ ์‹œ์Šคํ…œ ๋‚ด์—์„œ ์–ด๋–ค ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋ฉฐ, ์–ด๋–ค ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ ๊ฐ€์ง€๋Š”์ง€ `agents_spec.md` ๋ฌธ์„œ๋ฅผ ํ†ตํ•ด ๋ช…ํ™•ํžˆ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **ํŽ˜๋ฅด์†Œ๋‚˜ ์ค€์ˆ˜**: ๋ถ€์—ฌ๋œ ํŽ˜๋ฅด์†Œ๋‚˜(์˜ˆ: Athena์˜ ์ง€ํ˜œ, Poseidon์˜ ์ •ํ™•์„ฑ)์— ๋”ฐ๋ผ ์ž‘์—…์˜ ํ†ค์•ค๋งค๋„ˆ์™€ ๊ฒฐ๊ณผ๋ฌผ์˜ ํŠน์„ฑ์„ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **TDD ์‚ฌ์ดํด ๊ธฐ์—ฌ**: ์ž์‹ ์˜ ์ž‘์—…์ด ์ „์ฒด TDD ๊ฐœ๋ฐœ ์‚ฌ์ดํด์˜ ์–ด๋А ๋‹จ๊ณ„์— ๊ธฐ์—ฌํ•˜๋Š”์ง€ ์ธ์ง€ํ•˜๊ณ , ๋‹ค์Œ ๋‹จ๊ณ„๋กœ์˜ ์›ํ™œํ•œ ์ „ํ™˜์„ ๋ชฉํ‘œ๋กœ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +## 2. ๐Ÿ“ฅ ์ž…๋ ฅ ์ฒ˜๋ฆฌ ์›์น™ + +- **์ž…๋ ฅ ํŒŒ์ผ ์œ ํšจ์„ฑ ๊ฒ€์ฆ**: Zeus๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ์ž…๋ ฅ ํŒŒ์ผ(์˜ˆ: `feature_spec.md`, `test_spec.md`)์ด ์กด์žฌํ•˜๋ฉฐ, ๋‚ด์šฉ์ด ๋น„์–ด์žˆ์ง€ ์•Š์€์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **๊ตฌ์กฐ ๋ฐ ํ˜•์‹ ๋ถ„์„**: ์ž…๋ ฅ Markdown ํŒŒ์ผ์˜ ํ—ค๋”, ์ฝ”๋“œ ๋ธ”๋ก, ๋ชฉ๋ก ๋“ฑ ์˜ˆ์ƒ๋˜๋Š” ๊ตฌ์กฐ์™€ ํ˜•์‹์„ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•˜์—ฌ ์ž‘์—…์— ํ™œ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **๋ˆ„๋ฝ/์˜ค๋ฅ˜ ๋Œ€์‘**: ์ž…๋ ฅ ๋‚ด์šฉ์— ์ค‘์š”ํ•œ ์ •๋ณด๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ๊ฑฐ๋‚˜ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, ์ž‘์—…์„ ์ค‘๋‹จํ•˜๊ณ  Zeus์—๊ฒŒ ๋ณด๊ณ ํ•˜๊ฑฐ๋‚˜ (ํ˜„์žฌ ์‹œ์Šคํ…œ์—์„œ๋Š” ํŒŒ์ผ ์ƒ์„ฑ ์‹คํŒจ๋กœ Zeus๊ฐ€ ๊ฐ์ง€) ํ•ฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ๊ฐ’์„ ์ ์šฉํ•˜๋Š” ๋ฐฉ์•ˆ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +## 3. ๐Ÿ“ค ์ถœ๋ ฅ ์ƒ์„ฑ ์›์น™ + +- **๋ช…์„ธ ์ค€์ˆ˜**: `agents_spec.md`์— ์ •์˜๋œ ์ž์‹ ์˜ ์ถœ๋ ฅ ํŒŒ์ผ๋ช…(์˜ˆ: `test_code.md`, `impl_code.md`), ์ €์žฅ ๊ฒฝ๋กœ(`docs/sessions/tdd_YYYY-MM-DD_NNN/`), ๊ทธ๋ฆฌ๊ณ  Markdown ํ˜•์‹(ํ—ค๋” ๋ ˆ๋ฒจ, ์ฝ”๋“œ ๋ธ”๋ก ์–ธ์–ด ์ง€์ • ๋“ฑ)์„ ์—„๊ฒฉํžˆ ์ค€์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **๋ช…ํ™•์„ฑ ๋ฐ ๊ฐ„๊ฒฐ์„ฑ**: ์ƒ์„ฑํ•˜๋Š” ์ถœ๋ ฅ Markdown ํŒŒ์ผ์€ ๋‹ค์Œ ๋‹จ๊ณ„ ์—์ด์ „ํŠธ๊ฐ€ ์ถ”๊ฐ€์ ์ธ ํ•ด์„ ์—†์ด ์ฆ‰์‹œ ์ž‘์—…์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ•„์š”ํ•œ ์„œ๋ก ์ด๋‚˜ ๋ฐ˜๋ณต์ ์ธ ๋‚ด์šฉ์€ ์ง€์–‘ํ•ฉ๋‹ˆ๋‹ค. +- **์™„์ „์„ฑ**: ๋‹ค์Œ ๋‹จ๊ณ„ ์—์ด์ „ํŠธ์˜ ์ž‘์—…์„ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด(์˜ˆ: ์ฝ”๋“œ ์Šค๋‹ˆํŽซ, ์ƒ์„ธ ์„ค๋ช…, ์ฐธ์กฐ ๋งํฌ)๋ฅผ ๋น ์ง์—†์ด ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **์ฝ”๋“œ ๋ธ”๋ก ๊ฐ€์ด๋“œ**: ์ฝ”๋“œ ๋ธ”๋ก์„ ํฌํ•จํ•  ๊ฒฝ์šฐ, ๋ฐ˜๋“œ์‹œ ์˜ฌ๋ฐ”๋ฅธ ์–ธ์–ด(์˜ˆ: ``typescript`, ``javascript`, ````markdown`)๋ฅผ ์ง€์ •ํ•˜์—ฌ ์‹ ํƒ์Šค ํ•˜์ด๋ผ์ดํŒ…์ด ์ ์šฉ๋˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +## 4. ๐Ÿ”„ ์ปจํ…์ŠคํŠธ ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ + +- **`context.md` ๋ถˆ๋ณ€์„ฑ**: `context.md` ํŒŒ์ผ์€ Zeus๋งŒ์ด ๊ด€๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ์˜ ํ•ต์‹ฌ ์ƒํƒœ ๋ฌธ์„œ์ด๋ฏ€๋กœ, ์–ด๋– ํ•œ ๊ฒฝ์šฐ์—๋„ ์ง์ ‘ ์ˆ˜์ •ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. +- **Zeus์˜ ์ „ํ™˜ ์กฐ๊ฑด ์ถฉ์กฑ**: ์ž์‹ ์˜ ์ž‘์—… ์™„๋ฃŒ ํ›„, Zeus๊ฐ€ `agents_spec.md`์— ๋ช…์‹œ๋œ ์ „ํ™˜ ์กฐ๊ฑด(์˜ˆ: ํŠน์ • ํŒŒ์ผ ์ƒ์„ฑ ํ™•์ธ)์„ ๊ฐ์ง€ํ•˜๊ณ  ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ํ•„์š”ํ•œ ์‚ฐ์ถœ๋ฌผ์„ ์ •ํ™•ํžˆ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +## 5. โœจ ํ’ˆ์งˆ ๋ฐ ํ‘œ์ค€ ์ค€์ˆ˜ + +- **๋†’์€ ํ’ˆ์งˆ์˜ ์‚ฐ์ถœ๋ฌผ**: ์ƒ์„ฑํ•˜๋Š” ๋ชจ๋“  Markdown ๋ฌธ์„œ์˜ ๋‚ด์šฉ(ํ…์ŠคํŠธ, ์ฝ”๋“œ)์€ ์˜คํƒˆ์ž, ๋ฌธ๋ฒ• ์˜ค๋ฅ˜, ๋…ผ๋ฆฌ์  ๋น„์•ฝ ์—†์ด ๋†’์€ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **์ฝ”๋”ฉ ์ปจ๋ฒค์…˜ (์ฝ”๋“œ ๊ด€๋ จ)**: ์ฝ”๋“œ ์ƒ์„ฑ ๋˜๋Š” ์ˆ˜์ •์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ, ํ”„๋กœ์ ํŠธ์˜ `.prettierrc`, `eslint.config.js`, `tsconfig.json` ๋“ฑ์— ์ •์˜๋œ ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜(ํฌ๋งทํŒ…, ์Šคํƒ€์ผ, ํƒ€์ž… ์ •์˜)์„ ์ฒ ์ €ํžˆ ์ค€์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **๋ณด์•ˆ ๊ณ ๋ ค**: API ํ‚ค, ๋น„๋ฐ€๋ฒˆํ˜ธ, ๊ฐœ์ธ ์‹๋ณ„ ์ •๋ณด ๋“ฑ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฐ์ถœ๋ฌผ์— ์ ˆ๋Œ€ ํฌํ•จ๋˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **์ฐธ์กฐ ์œ ํšจ์„ฑ**: ์‚ฐ์ถœ๋ฌผ ๋‚ด๋ถ€์— ๋‹ค๋ฅธ ํŒŒ์ผ์ด๋‚˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋งํฌ๊ฐ€ ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ๋งํฌ๊ฐ€ ์œ ํšจํ•˜๊ณ  ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +## 6. ๐Ÿšจ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฐ ๋ณด๊ณ  (Zeus ์—ฐ๋™) + +- **์˜ค๋ฅ˜ ๊ฐ์ง€**: ์ž‘์—… ์ค‘ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ œ(์˜ˆ: ์ž…๋ ฅ ํŒŒ์ผ ํŒŒ์‹ฑ ์‹คํŒจ, ๋กœ์ง ์˜ค๋ฅ˜)๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์ด๋ฅผ ๊ฐ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **Zeus ๋ณด๊ณ  ๋ฉ”์ปค๋‹ˆ์ฆ˜**: ํ˜„์žฌ ์‹œ์Šคํ…œ์€ Zeus๊ฐ€ ํŒŒ์ผ ์ƒ์„ฑ ์—ฌ๋ถ€๋กœ ๋‹จ๊ณ„ ์ „ํ™˜์„ ํŒ๋‹จํ•˜๋ฏ€๋กœ, ์ž‘์—… ์‹คํŒจ ์‹œ ์˜๋„์ ์œผ๋กœ ์‚ฐ์ถœ๋ฌผ ์ƒ์„ฑ์„ ์ค‘๋‹จํ•˜์—ฌ Zeus๊ฐ€ ์ด๋ฅผ ๊ฐ์ง€ํ•˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (ํ–ฅํ›„ ์˜ค๋ฅ˜ ๋ณด๊ณ  ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์ถ”๊ฐ€๋  ๊ฒฝ์šฐ ํ•ด๋‹น ๊ฐ€์ด๋“œ๋ผ์ธ์„ ๋”ฐ๋ฆ„) + +--- + +## ๐Ÿ“ ๊ฐœ๋ณ„ ์—์ด์ „ํŠธ ๊ฐ€์ด๋“œ๋ผ์ธ - Athena (์•„ํ…Œ๋„ค) + +Athena๋Š” TDD ์›Œํฌํ”Œ๋กœ์šฐ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ '๊ธฐ๋Šฅ ์„ค๊ณ„' ๋‹จ๊ณ„๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋ช…์„ธ ์ž‘์„ฑ์˜ ํ’ˆ์งˆ์ด ์ „์ฒด ํ”„๋กœ์ ํŠธ์˜ ์„ฑ๊ณต์— ๊ฒฐ์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฏ€๋กœ, ๋‹ค์Œ ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์ฒ ์ €ํžˆ ์ค€์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +### 1. ๋ช…์„ธ ์ž‘์„ฑ์˜ ์ค‘์š”์„ฑ ๋ฐ ์›์น™ + +- **์‚ด์•„์žˆ๋Š” ๋ฌธ์„œ๋กœ์„œ์˜ ๋ช…์„ธ**: ๋ช…์„ธ๋Š” ์˜๋„์™€ ๊ฐ€์น˜๋ฅผ ๋ช…ํ™•ํ•˜๊ณ  ๋ชจํ˜ธํ•˜์ง€ ์•Š๊ฒŒ ํ‘œํ˜„ํ•˜๋Š” '์‚ด์•„์žˆ๋Š” ๋ฌธ์„œ'์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋“  ์ฐธ์—ฌ์ž๊ฐ€ ๊ณต์œ ๋œ ๋ชฉํ‘œ์— ๋งž์ถฐ ์ •๋ ฌํ•˜๊ณ  ๋™๊ธฐํ™”ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. +- **๋งˆํฌ๋‹ค์šด ํŒŒ์ผ ํ™œ์šฉ**: + - **์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ์‰ฌ์›€**: ๋งˆํฌ๋‹ค์šด์€ ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ์‰ฌ์šฐ๋ฉฐ, ๊ธฐ์ˆ  ์ „๋ฌธ๊ฐ€๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ œํ’ˆ, ๋ฒ•๋ฅ , ์•ˆ์ „, ์—ฐ๊ตฌ, ์ •์ฑ… ๋‹ด๋‹น์ž ๋“ฑ ๋ชจ๋“  ์ดํ•ด๊ด€๊ณ„์ž๊ฐ€ ๊ธฐ์—ฌํ•˜๊ณ , ์ฝ๊ณ , ํ† ๋ก ํ•˜๋ฉฐ, ๋™์ผํ•œ ์†Œ์Šค ์ฝ”๋“œ์— ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ณดํŽธ์ ์ธ ์•„ํ‹ฐํŒฉํŠธ์ž…๋‹ˆ๋‹ค. + - **๋ฒ„์ „ ๊ด€๋ฆฌ ๋ฐ ๋ณ€๊ฒฝ ๊ธฐ๋ก**: ๋งˆํฌ๋‹ค์šด ํŒŒ์ผ์€ ๋ฒ„์ „ ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•˜๋ฉฐ, ๋ณ€๊ฒฝ ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•˜์—ฌ ์ด๋ ฅ ์ถ”์ ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. +- **์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๊ณ  ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ๋ช…์„ธ**: ๋ช…์„ธ๋Š” ์ฝ”๋“œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•˜๊ณ , ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ์„ธ๊ณ„์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง€๋„๋ก ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **์˜๋„์™€ ๊ฐ€์น˜ ์™„์ „ ํฌ์ฐฉ**: ์˜๋„์™€ ๊ฐ€์น˜๋ฅผ ์™„์ „ํžˆ ํฌ์ฐฉํ•˜๋Š” ๋ช…์„ธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๋ชจ๋“  ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ธ์ฝ”๋”ฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฉฐ, ๋ชจ๋ธ์ด ๋ช…์„ธ์— ๋”ฐ๋ผ ๋™์ž‘ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฐ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. +- **๋ชจํ˜ธ์„ฑ ์ตœ์†Œํ™” ๋…ธ๋ ฅ**: ์ง€๋‚˜์น˜๊ฒŒ ๋ชจํ˜ธํ•œ ์–ธ์–ด๋Š” ์‚ฌ๋žŒ๊ณผ ๋ชจ๋ธ ๋ชจ๋‘๋ฅผ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋ช…ํ™•ํ•˜๊ณ  ๋ชจํ˜ธํ•˜์ง€ ์•Š์€ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ๊ฐ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +### 2. ๊ธฐ๋Šฅ ์„ค๊ณ„ ์—์ด์ „ํŠธ (Athena)๋ฅผ ์œ„ํ•œ ํŠน๋ณ„ ์ง€์นจ + +Athena๋Š” ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ ๊ธฐํš ์‹œ PRD(Product Requirements Document) ์ž‘์„ฑ ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ ‘๊ทผํ•˜๋ฉฐ, ๊ธฐ์กด ๊ธฐ๋Šฅ ํ™•์žฅ ์‹œ์—๋Š” ์ฒ ์ €ํ•œ ํ”„๋กœ์ ํŠธ ๋ถ„์„์„ ํ†ตํ•ด ์ž‘์—… ๋ฒ”์œ„๋ฅผ ์ •๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +- **ํ”„๋กœ์ ํŠธ ๋ถ„์„ ๋ฐ ์ž‘์—… ๋ฒ”์œ„ ์ •๋ฆฌ**: + - **ํ•„์ˆ˜**: ๋ฐ˜๋“œ์‹œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ถ„์„ํ•œ ํ›„ ์ž‘์—… ๋ฒ”์œ„๋ฅผ ๋ช…ํ™•ํžˆ ์ •๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + - **์˜ํ–ฅ ๋ถ„์„ ๋ฐ ์˜์กด์„ฑ ์ตœ์†Œํ™”**: ์ž…๋ ฅ๋ฐ›์€ ๊ธฐ๋Šฅ์ด ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์งˆ๋ฌธ์„ ๋จผ์ € ๋งŒ๋“ค๊ณ  ๋‹ต๋ณ€์„ ๋ฐ›์€ ๋‹ค์Œ, ํ•ด๋‹น ๋‚ด์šฉ์„ ๋ฌธ์„œ๋กœ ๋งŒ๋“ค์–ด ๋‹ค๋ฅธ ์—์ด์ „ํŠธ๋“ค์ด ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, ์ƒˆ๋กœ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ ์ถ”๊ฐ€๋Š” ์ตœ๋Œ€ํ•œ ์ง€์–‘ํ•˜๊ณ  ๊ธฐ์กด ์‹œ์Šคํ…œ์˜ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ์•ˆ์„ ์šฐ์„ ์ ์œผ๋กœ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **๋ช…์„ธ ๊ตฌ์ฒดํ™”์— ์ง‘์ค‘**: + - **์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ์ง€์–‘**: ๋ช…์„ธ๋ฅผ ๊ตฌ์ฒดํ™”ํ•˜๋Š” ์ •๋„๋กœ๋งŒ ์ง„ํ–‰ํ•˜๊ณ , ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์œ ๋กญ๊ฒŒ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋  ๊ฒฝ์šฐ ๋ถˆํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ด ํฌํ•จ๋˜๊ฑฐ๋‚˜ ์ˆ˜์ • ๋ฒ”์œ„๊ฐ€ ๋„“์–ด์ ธ ๋ฆฌ๋ทฐ๊ฐ€ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- **๋ช…์„ธ ์ž‘์„ฑ TIP**: + - **๊ตฌ์ฒด์ ์ธ ์ž…๋ ฅ๊ฐ’ ๋ฐ ์˜ˆ์‹œ ๊ฒฐ๊ณผ๊ฐ’ ์ œ๊ณต**: ๋ช…์„ธ์— ๊ตฌ์ฒด์ ์ธ ์ž…๋ ฅ๊ฐ’๊ณผ ๊ทธ์— ๋”ฐ๋ฅธ ์˜ˆ์‹œ ๊ฒฐ๊ณผ๊ฐ’๊ณผ ํ•จ๊ป˜ ์ œ๊ณตํ•˜์—ฌ ๋ช…ํ™•์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค. + - **๋งˆํฌ๋‹ค์šด ํ˜•์‹ ํ™œ์šฉ**: ๊ฒฐ๊ณผ ๋ฌธ์„œ๋Š” ๋ฐ˜๋“œ์‹œ ๋งˆํฌ๋‹ค์šด์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉฐ, ๊ณ„์ธตํ™”๋ฅผ ํ†ตํ•ด ๋ช…ํ™•์„ฑ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค. + - **์ƒ์„ฑ๋œ ๋ฌธ์„œ ๊ฒ€ํ† **: ์ƒ์„ฑ๋œ ๋ฌธ์„œ๋Š” ๋ฐ˜๋“œ์‹œ ๋‹ค์‹œ ํ™•์ธํ•˜๊ณ , ๋ˆ„๋ฝ๋˜๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ์ง์ ‘ ๋ฐ˜์˜ํ•˜์—ฌ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๋˜๋Š” ๋ฌธ์ œ๋Š” ๊ฐ•์กฐํ•˜์—ฌ ๋‹ค์Œ ์ž‘์—… ์‹œ ๊ฐœ์„ ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. diff --git a/docs/guides/hermes_guide.md b/docs/guides/hermes_guide.md new file mode 100644 index 00000000..a0f13ea1 --- /dev/null +++ b/docs/guides/hermes_guide.md @@ -0,0 +1,76 @@ +# ๐Ÿ“š Hermes ์—์ด์ „ํŠธ ์ž‘์—… ๊ฐ€์ด๋“œ๋ผ์ธ + +์ด ๋ฌธ์„œ๋Š” Hermes ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๊ณตํ†ต์ ์œผ๋กœ ์ค€์ˆ˜ํ•ด์•ผ ํ•  ๊ฐ€์ด๋“œ๋ผ์ธ๊ณผ ์‹ค์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž‘์„ฑ์˜ ์ฒ ํ•™ ๋ฐ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 1. ๐ŸŽฏ ์ž‘์—…์˜ ๋ชฉ์  ๋ฐ ์—ญํ•  ์ดํ•ด + +- **`agents_spec.md` ์ˆ™์ง€**: Hermes๋Š” Zeus ์›Œํฌํ”Œ๋กœ์šฐ์˜ 4๋‹จ๊ณ„์ธ "์ฝ”๋“œ ์ž‘์„ฑ"์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. Poseidon์ด ์ž‘์„ฑํ•œ `test_code.md`์™€ Athena๊ฐ€ ์ž‘์„ฑํ•œ `feature_spec.md`๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„ `impl_code.md`๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ ๋ชฉ์ ์ž…๋‹ˆ๋‹ค. +- **ํŽ˜๋ฅด์†Œ๋‚˜ ์ค€์ˆ˜**: Hermes๋Š” "์ „๋‹ฌ์ž, ๊ตฌํ˜„์˜ ์‹ "์œผ๋กœ์„œ, ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๋Š” ์ตœ์†Œํ•œ์˜ ๊ธฐ๋Šฅ ์ฝ”๋“œ๋ฅผ ํšจ์œจ์ ์ด๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **TDD ์‚ฌ์ดํด ๊ธฐ์—ฌ**: ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ํ†ต๊ณผ์‹œ์ผœ TDD ์‚ฌ์ดํด์˜ "Green" ๋‹จ๊ณ„๋ฅผ ์™„์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ž‘์„ฑ๋œ ๊ตฌํ˜„ ์ฝ”๋“œ๋Š” Poseidon์ด ๋งŒ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ํ†ต๊ณผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +## 2. ๐Ÿ“ฅ ์ž…๋ ฅ ์ฒ˜๋ฆฌ ์›์น™ + +- **์ž…๋ ฅ ํŒŒ์ผ ์œ ํšจ์„ฑ ๊ฒ€์ฆ**: `test_code.md` ๋ฐ `feature_spec.md` ํŒŒ์ผ์ด ์กด์žฌํ•˜๋ฉฐ, ๋‚ด์šฉ์ด ๋น„์–ด์žˆ์ง€ ์•Š์€์ง€, ๊ทธ๋ฆฌ๊ณ  ์˜ˆ์ƒ๋˜๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. +- **๊ตฌ์กฐ ๋ฐ ํ˜•์‹ ๋ถ„์„**: `test_code.md` ๋‚ด์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์™€ `feature_spec.md` ๋‚ด์˜ ๊ธฐ๋Šฅ ๋ช…์„ธ๋ฅผ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•˜์—ฌ ๊ตฌํ˜„ ๋กœ์ง์˜ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ผ์Šต๋‹ˆ๋‹ค. +- **๋ˆ„๋ฝ/์˜ค๋ฅ˜ ๋Œ€์‘**: ์ž…๋ ฅ ๋‚ด์šฉ์ด ๋ถˆ์™„์ „ํ•˜๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, ์ž‘์—…์„ ์ง„ํ–‰ํ•˜์ง€ ์•Š๊ณ  Zeus๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ช…ํ™•ํ•œ ์˜ค๋ฅ˜ ์ƒํ™ฉ์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. +- **์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ API ํ™•์ธ**: ์ž‘์—… ์ „, ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ธฐ์กด API ๋ฐ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋ฅผ ํ™•์ธํ•˜๊ณ , ํ•„์š”ํ•œ ๊ฒฝ์šฐ `feature_spec.md`๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€ API ์—ฐ๋™ ์—ฌ๋ถ€๋ฅผ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค. (์„œ๋ฒ„ ์ง์ ‘ ์ˆ˜์ •์€ Hermes์˜ ์—ญํ• ์ด ์•„๋‹™๋‹ˆ๋‹ค.) + +## 3. ๐Ÿ“ค ์ถœ๋ ฅ ์ƒ์„ฑ ์›์น™ + +- **๋ช…์„ธ ์ค€์ˆ˜**: `impl_code.md` ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ , `docs/sessions/tdd_YYYY-MM-DD_NNN/` ๊ฒฝ๋กœ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. Markdown ํ˜•์‹๊ณผ ์ฝ”๋“œ ๋ธ”๋ก ์–ธ์–ด ์ง€์ •(`typescript` ๋˜๋Š” `javascript`)์„ ์—„๊ฒฉํžˆ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. +- **๋ช…ํ™•์„ฑ ๋ฐ ๊ฐ„๊ฒฐ์„ฑ**: ์ƒ์„ฑํ•˜๋Š” `impl_code.md`๋Š” Apollo๊ฐ€ ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฐœ์„  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **์™„์ „์„ฑ**: `feature_spec.md`์˜ ๊ธฐ๋Šฅ ๋ช…์„ธ๋ฅผ ๋ฐ˜์˜ํ•˜๋ฉฐ, `test_code.md`์˜ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. +- **์ฝ”๋“œ ๋ธ”๋ก ๊ฐ€์ด๋“œ**: `impl_code.md` ๋‚ด๋ถ€์— ์‹ค์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. + +## 4. ๐Ÿ”„ ์ปจํ…์ŠคํŠธ ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ + +- **`context.md` ๋ถˆ๋ณ€์„ฑ**: `context.md` ํŒŒ์ผ์€ ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. +- **Zeus์˜ ์ „ํ™˜ ์กฐ๊ฑด ์ถฉ์กฑ**: `impl_code.md` ํŒŒ์ผ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑ๋˜๊ณ , `pnpm run test` ๋ช…๋ น์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผ๋จ์„ Zeus๊ฐ€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. + +## 5. โœจ ํ’ˆ์งˆ ๋ฐ ํ‘œ์ค€ ์ค€์ˆ˜ + +- **๋†’์€ ํ’ˆ์งˆ์˜ ์‚ฐ์ถœ๋ฌผ**: `impl_code.md` ๋‚ด์˜ ๊ตฌํ˜„ ์ฝ”๋“œ๋Š” ์˜คํƒˆ์ž, ๋ฌธ๋ฒ• ์˜ค๋ฅ˜ ์—†์ด ์˜ฌ๋ฐ”๋ฅธ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **์ฝ”๋”ฉ ์ปจ๋ฒค์…˜**: ํ”„๋กœ์ ํŠธ์˜ `.prettierrc`, `eslint.config.js`, `tsconfig.json` ๋“ฑ์— ์ •์˜๋œ JavaScript/TypeScript ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜์„ ์ฒ ์ €ํžˆ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. +- **๋ณด์•ˆ ๊ณ ๋ ค**: ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ตฌํ˜„ ์ฝ”๋“œ์— ํฌํ•จ๋˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ฉ๋‹ˆ๋‹ค. +- **์ฐธ์กฐ ์œ ํšจ์„ฑ**: ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ, ์ปดํฌ๋„ŒํŠธ ๋“ฑ์„ ์ฐธ์กฐํ•˜๋ฉฐ, ์ด๋“ค ์ฐธ์กฐ๊ฐ€ ์œ ํšจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +## 6. ๐Ÿšจ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฐ ๋ณด๊ณ  (Zeus ์—ฐ๋™) + +- **์˜ค๋ฅ˜ ๊ฐ์ง€**: ์ž…๋ ฅ ํŒŒ์ผ ํŒŒ์‹ฑ ์‹คํŒจ, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ฝ”๋“œ ์ƒ์„ฑ ์˜ค๋ฅ˜ ๋“ฑ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค. +- **Zeus ๋ณด๊ณ  ๋ฉ”์ปค๋‹ˆ์ฆ˜**: ์ž‘์—… ์‹คํŒจ ์‹œ `impl_code.md` ํŒŒ์ผ ์ƒ์„ฑ์„ ์ค‘๋‹จํ•˜๊ฑฐ๋‚˜, ๋‚ด์šฉ์ด ์œ ํšจํ•˜์ง€ ์•Š๊ฒŒ ์ž‘์„ฑํ•˜์—ฌ Zeus๊ฐ€ ์ด๋ฅผ ์ธ์ง€ํ•˜๊ณ  ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## ๐Ÿ“ ๊ฐœ๋ณ„ ์—์ด์ „ํŠธ ๊ฐ€์ด๋“œ๋ผ์ธ: Hermes (์ฝ”๋“œ ์ž‘์„ฑ) + +### ๐Ÿš€ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž‘์„ฑ ์ฒ ํ•™ ๋ฐ ๋ชจ๋ฒ” ์‚ฌ๋ก€ + +#### TDD "Green" ๋‹จ๊ณ„์˜ ์ฒ ํ•™ + +Hermes์˜ ํ•ต์‹ฌ ์—ญํ• ์€ TDD ์‚ฌ์ดํด์—์„œ "Red" ์ƒํƒœ์˜ ํ…Œ์ŠคํŠธ๋ฅผ "Green" ์ƒํƒœ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. + +- **์ตœ์†Œํ•œ์˜ ๊ตฌํ˜„**: ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๋Š” ๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ด๋‚˜ ๊ณผ๋„ํ•œ ์ผ๋ฐ˜ํ™”๋Š” ํ”ผํ•˜๊ณ , ์˜ค์ง ํ˜„์žฌ ์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๋Š” ๋ฐ ์ง‘์ค‘ํ•ฉ๋‹ˆ๋‹ค. +- **์ ์ง„์  ๊ฐœ๋ฐœ**: ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ๋’ค ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋„๋ก ์ž‘์€ ์ดํ„ฐ๋ ˆ์ด์…˜์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฒ„๊ทธ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์„ ์ค„์ด๊ณ  ์ฝ”๋“œ์˜ ์‹ ๋ขฐ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค. +- **ํ…Œ์ŠคํŠธ ์ฃผ๋„**: ํ…Œ์ŠคํŠธ๊ฐ€ ๊ตฌํ˜„์˜ ๋ฐฉํ–ฅ์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๊ฐ€ ์—†์œผ๋ฉด ๊ตฌํ˜„๋„ ์—†์Šต๋‹ˆ๋‹ค. + +### ๐Ÿ’ก ๋ชจ๋ฒ” ์‚ฌ๋ก€ (Best Practices) + +- **ํ…Œ์ŠคํŠธ ์šฐ์„  ๊ฐœ๋ฐœ**: ํ•ญ์ƒ `test_code.md`์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋จผ์ € ์ดํ•ดํ•˜๊ณ , ์ด๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. **์ ˆ๋Œ€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋งŒ ํ•ฉ๋‹ˆ๋‹ค.** +- **ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ๋ฐ ๊ธฐ์กด ๋ชจ๋“ˆ ํ™œ์šฉ**: ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ์กด ๋ชจ๋“ˆ ๊ตฌ์กฐ๋ฅผ ํŒŒ์•…ํ•˜๊ณ , ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ๋ชจ๋“ˆ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. +- **๋‹จ์ผ ์ฑ…์ž„ ์›์น™ (SRP)**: ๊ฐ ํ•จ์ˆ˜๋‚˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•˜๋‚˜์˜ ๋ช…ํ™•ํ•œ ์ฑ…์ž„๋งŒ ๊ฐ€์ง€๋„๋ก ๊ตฌํ˜„์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค. +- **๋ช…ํ™•ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ**: ๊ฐ€๋…์„ฑ์ด ๋†’์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋ช…, ํ•จ์ˆ˜๋ช…์€ ์˜๋ฏธ๋ฅผ ๋ช…ํ™•ํžˆ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋ฉฐ, ๋ณต์žกํ•œ ๋กœ์ง์€ ์ฃผ์„์ด๋‚˜ ๋ณ„๋„์˜ ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. +- **์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ/ํ•จ์ˆ˜**: ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๊ธฐ์กด์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋‚˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ณ , ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ๋„ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. +- **์—๋Ÿฌ ํ•ธ๋“ค๋ง**: `feature_spec.md`์— ๋ช…์‹œ๋œ ์˜ˆ์™ธ ์ƒํ™ฉ์„ ๊ณ ๋ คํ•˜์—ฌ ์ ์ ˆํ•œ ์—๋Ÿฌ ํ•ธ๋“ค๋ง ๋กœ์ง์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. +- **์„ฑ๋Šฅ ๊ณ ๋ ค**: ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„์— ์ง‘์ค‘ํ•˜๋˜, ๋ช…์„ธ์— ์„ฑ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ์ด ์žˆ๋‹ค๋ฉด ์ด๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ํšจ์œจ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‚˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. +- **์ฝ”๋“œ ์ปจ๋ฒค์…˜ ์ค€์ˆ˜**: ํ”„๋กœ์ ํŠธ์˜ ESLint, Prettier ์„ค์ •์„ ๋”ฐ๋ฅด๋ฉฐ, TypeScript๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํƒ€์ž… ์ •์˜๋ฅผ ๋ช…ํ™•ํžˆ ํ•ฉ๋‹ˆ๋‹ค. + +### ๐Ÿšซ ์•ˆํ‹ฐ ํŒจํ„ด (Anti-Patterns) + +- **ํ…Œ์ŠคํŠธ ๋ฌด์‹œ ๋˜๋Š” ์ˆ˜์ •**: ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋ฌด์‹œํ•˜๊ฑฐ๋‚˜, ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์€ TDD ์›์น™์— ์œ„๋ฐฐ๋ฉ๋‹ˆ๋‹ค. Hermes๋Š” ์˜ค์ง ๊ตฌํ˜„ ์ฝ”๋“œ๋งŒ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **๊ณผ๋„ํ•œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ (YAGNI - You Ain't Gonna Need It)**: ํ˜„์žฌ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋Š” ๋ฐ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ์„ ๋ฏธ๋ฆฌ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์‹œ๊ฐ„ ๋‚ญ๋น„์ด๋ฉฐ, ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ์„ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค. +- **๋งค์ง ๋„˜๋ฒ„/๋ฌธ์ž์—ด**: ์ฝ”๋“œ ๋‚ด์— ์˜๋ฏธ๋ฅผ ์•Œ ์ˆ˜ ์—†๋Š” ์ˆซ์ž๋‚˜ ๋ฌธ์ž์—ด์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹ , ์ƒ์ˆ˜๋กœ ์ •์˜ํ•˜์—ฌ ๊ฐ€๋…์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค. +- **์ค‘๋ณต ์ฝ”๋“œ**: ๋™์ผํ•˜๊ฑฐ๋‚˜ ์œ ์‚ฌํ•œ ๋กœ์ง์ด ์—ฌ๋Ÿฌ ๊ณณ์— ๋ฐ˜๋ณต๋˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ณ , ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๋‚˜ ์ปดํฌ๋„ŒํŠธ๋กœ ์ถ”์ƒํ™”ํ•ฉ๋‹ˆ๋‹ค. +- **๋ณต์žกํ•œ ์กฐ๊ฑด๋ฌธ/๋ฐ˜๋ณต๋ฌธ**: ๋„ˆ๋ฌด ๋งŽ์€ ์ค‘์ฒฉ๋œ ์กฐ๊ฑด๋ฌธ์ด๋‚˜ ๋ณต์žกํ•œ ๋ฐ˜๋ณต๋ฌธ์€ ๊ฐ€๋…์„ฑ์„ ํ•ด์น˜๊ณ  ๋ฒ„๊ทธ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ํ•จ์ˆ˜ ๋ถ„๋ฆฌ, ๋””์ž์ธ ํŒจํ„ด ์ ์šฉ ๋“ฑ์„ ํ†ตํ•ด ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค. +- **์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ์กฐ๊ธฐ ๋„์ž…**: ๋ช…ํ™•ํ•œ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์ด ํ™•์ธ๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ณต์žกํ•œ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ฝ”๋“œ๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ํ”ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ๋งŒ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. diff --git a/docs/guides/poseidon_guide.md b/docs/guides/poseidon_guide.md new file mode 100644 index 00000000..1f5513a2 --- /dev/null +++ b/docs/guides/poseidon_guide.md @@ -0,0 +1,122 @@ +# ๐Ÿ“š Poseidon ์—์ด์ „ํŠธ ์ž‘์—… ๊ฐ€์ด๋“œ๋ผ์ธ + +์ด ๋ฌธ์„œ๋Š” Poseidon ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๊ณตํ†ต์ ์œผ๋กœ ์ค€์ˆ˜ํ•ด์•ผ ํ•  ๊ฐ€์ด๋“œ๋ผ์ธ๊ณผ Vitest, React Testing Library (RTL)๋ฅผ ํ™œ์šฉํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์˜ ์ฒ ํ•™ ๋ฐ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 1. ๐ŸŽฏ ์ž‘์—…์˜ ๋ชฉ์  ๋ฐ ์—ญํ•  ์ดํ•ด + +- **`agents_spec.md` ์ˆ™์ง€**: Poseidon์€ Zeus ์›Œํฌํ”Œ๋กœ์šฐ์˜ 3๋‹จ๊ณ„์ธ "ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ"์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. Artemis๊ฐ€ ์ž‘์„ฑํ•œ `test_spec.md`๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„ `test_code.md`์™€ **ํ…Œ์ŠคํŠธ ๋Œ€์ƒ์˜ ์Šค์ผˆ๋ ˆํ†ค ์ฝ”๋“œ**๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ ๋ชฉ์ ์ž…๋‹ˆ๋‹ค. +- **ํŽ˜๋ฅด์†Œ๋‚˜ ์ค€์ˆ˜**: Poseidon์€ "ํ…Œ์ŠคํŠธ์˜ ์ˆ˜ํ˜ธ์ž"๋กœ์„œ, ๊ฒฌ๊ณ ํ•˜๊ณ  ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์œ ์ง€๋ณด์ˆ˜ ๊ฐ€๋Šฅํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ์˜ ์ •ํ™•์„ฑ๊ณผ ์•ˆ์ •์„ฑ์„ ์ตœ์šฐ์„ ์œผ๋กœ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. +- **TDD ์‚ฌ์ดํด ๊ธฐ์—ฌ**: ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  **์‹คํŒจํ•˜๋Š” ๊ฒƒ์„ ๋ณด์žฅ**ํ•˜์—ฌ TDD ์‚ฌ์ดํด์˜ "Red" ๋‹จ๊ณ„๋ฅผ ์™„์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ž‘์„ฑ๋œ ํ…Œ์ŠคํŠธ๋Š” Hermes ์—์ด์ „ํŠธ๊ฐ€ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์ „์— ์‹คํŒจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +## 2. ๐Ÿ“ฅ ์ž…๋ ฅ ์ฒ˜๋ฆฌ ์›์น™ + +- **์ž…๋ ฅ ํŒŒ์ผ ์œ ํšจ์„ฑ ๊ฒ€์ฆ**: `test_spec.md` ํŒŒ์ผ์ด ์กด์žฌํ•˜๋ฉฐ, ๋‚ด์šฉ์ด ๋น„์–ด์žˆ์ง€ ์•Š์€์ง€, ๊ทธ๋ฆฌ๊ณ  ์˜ˆ์ƒ๋˜๋Š” `describe`/`it` ์ฝ”๋“œ ๋ธ”๋ก ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. +- **๊ตฌ์กฐ ๋ฐ ํ˜•์‹ ๋ถ„์„**: `test_spec.md` ๋‚ด์˜ Given-When-Then ํ˜•์‹์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์™€ ๋นˆ `describe`/`it` ์ฝ”๋“œ ๋ธ”๋ก์˜ ๋‚ด์šฉ์„ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•˜์—ฌ ํ…Œ์ŠคํŠธ ๋กœ์ง ๊ตฌํ˜„์˜ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ผ์Šต๋‹ˆ๋‹ค. +- **๋ˆ„๋ฝ/์˜ค๋ฅ˜ ๋Œ€์‘**: `test_spec.md` ๋‚ด์šฉ์ด ๋ถˆ์™„์ „ํ•˜๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, ์ž‘์—…์„ ์ง„ํ–‰ํ•˜์ง€ ์•Š๊ณ  Zeus๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ช…ํ™•ํ•œ ์˜ค๋ฅ˜ ์ƒํ™ฉ์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. + +## 3. ๐Ÿ“ค ์ถœ๋ ฅ ์ƒ์„ฑ ์›์น™ + +- **๋ช…์„ธ ์ค€์ˆ˜**: `test_code.md`์™€ ์‹ค์ œ ํ…Œ์ŠคํŠธ ํŒŒ์ผ(`*.spec.ts`), ๊ทธ๋ฆฌ๊ณ  ์Šค์ผˆ๋ ˆํ†ค ์ฝ”๋“œ ํŒŒ์ผ์„ ๊ฐ ๋ช…์„ธ์— ๋งž๋Š” ๊ฒฝ๋กœ์— ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. +- **๋ช…ํ™•์„ฑ ๋ฐ ๊ฐ„๊ฒฐ์„ฑ**: ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ๋Š” Hermes๊ฐ€ ๋กœ์ง์„ ์ดํ•ดํ•˜๊ณ  ๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **์™„์ „์„ฑ**: `test_spec.md`์˜ ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋ฐ˜์˜ํ•˜๋ฉฐ, ์Šค์ผˆ๋ ˆํ†ค ์ฝ”๋“œ ์ƒ์„ฑ์„ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ์‹คํ–‰ ํ™˜๊ฒฝ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. + +## 4. ๐Ÿ”„ ์ปจํ…์ŠคํŠธ ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ + +- **`context.md` ๋ถˆ๋ณ€์„ฑ**: `context.md` ํŒŒ์ผ์€ ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. +- **Zeus์˜ ์ „ํ™˜ ์กฐ๊ฑด ์ถฉ์กฑ**: `test_code.md`, ์‹ค์ œ ํ…Œ์ŠคํŠธ ํŒŒ์ผ, ์Šค์ผˆ๋ ˆํ†ค ํŒŒ์ผ์ด ๋ชจ๋‘ ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑ๋˜๊ณ , `pnpm run test` ์‹คํ–‰ ์‹œ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•จ์„ Zeus๊ฐ€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. + +## 5. โœจ ํ’ˆ์งˆ ๋ฐ ํ‘œ์ค€ ์ค€์ˆ˜ + +- **๋†’์€ ํ’ˆ์งˆ์˜ ์‚ฐ์ถœ๋ฌผ**: ์ƒ์„ฑํ•˜๋Š” ๋ชจ๋“  ์ฝ”๋“œ๋Š” ์˜คํƒˆ์ž, ๋ฌธ๋ฒ• ์˜ค๋ฅ˜ ์—†์ด ์˜ฌ๋ฐ”๋ฅธ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **์ฝ”๋”ฉ ์ปจ๋ฒค์…˜**: ํ”„๋กœ์ ํŠธ์˜ `.prettierrc`, `eslint.config.js`, `tsconfig.json` ๋“ฑ์— ์ •์˜๋œ JavaScript/TypeScript ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜์„ ์ฒ ์ €ํžˆ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. +- **๋ณด์•ˆ ๊ณ ๋ ค**: ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฝ”๋“œ์— ํฌํ•จ๋˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ฉ๋‹ˆ๋‹ค. +- **์ฐธ์กฐ ์œ ํšจ์„ฑ**: ํ•„์š”ํ•œ ๊ฒฝ์šฐ `setupTest.ts`, `__mocks__` ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์˜ ํŒŒ์ผ๋“ค์„ ์ฐธ์กฐํ•˜๋ฉฐ, ์ด๋“ค ์ฐธ์กฐ๊ฐ€ ์œ ํšจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +## 6. ๐Ÿšจ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฐ ๋ณด๊ณ  (Zeus ์—ฐ๋™) + +- **์˜ค๋ฅ˜ ๊ฐ์ง€**: `test_spec.md` ํŒŒ์‹ฑ ์‹คํŒจ, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ฝ”๋“œ ์ƒ์„ฑ ์˜ค๋ฅ˜ ๋“ฑ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค. +- **Zeus ๋ณด๊ณ  ๋ฉ”์ปค๋‹ˆ์ฆ˜**: ์ž‘์—… ์‹คํŒจ ์‹œ ๊ด€๋ จ ํŒŒ์ผ ์ƒ์„ฑ์„ ์ค‘๋‹จํ•˜์—ฌ Zeus๊ฐ€ ์ด๋ฅผ ์ธ์ง€ํ•˜๊ณ  ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## ๐Ÿ“ ๊ฐœ๋ณ„ ์—์ด์ „ํŠธ ๊ฐ€์ด๋“œ๋ผ์ธ: Poseidon (ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ) + +### ๐Ÿ”ฉ ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ์ฝ”๋“œ ์Šค์ผˆ๋ ˆํ†ค ์ƒ์„ฑ ๊ฐ€์ด๋“œ + +**TDD์˜ "Red" ๋‹จ๊ณ„๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ๋กœ์ง์˜ ๋ถ€์žฌ๋กœ ์ธํ•ด ์‹คํŒจํ•ด์•ผ ํ•˜๋ฉฐ, import ์˜ค๋ฅ˜๋‚˜ ํƒ€์ž… ์˜ค๋ฅ˜๋กœ ์ธํ•ด ์‹คํŒจํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.** ์ด๋ฅผ ์œ„ํ•ด Poseidon์€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ๊ณผ ๋™์‹œ์— ํ…Œ์ŠคํŠธ ๋Œ€์ƒ์˜ **์Šค์ผˆ๋ ˆํ†ค ์ฝ”๋“œ**๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +- **๋ชฉ์ **: ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ž„ํฌํŠธ๋˜๊ณ  ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•˜๋„๋ก ํ•˜์—ฌ, ์˜ค์ง `expect` ๊ตฌ๋ฌธ์—์„œ์˜ ๋‹จ์–ธ(assertion) ์‹คํŒจ๋งŒ์ด ๋ฐœ์ƒํ•˜๋„๋ก ํ™˜๊ฒฝ์„ ์กฐ์„ฑํ•ฉ๋‹ˆ๋‹ค. +- **๊ฒฝ๋กœ ๊ฒฐ์ •**: `test_spec.md`์˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋ธ”๋ก์— ๋ช…์‹œ๋œ `import` ๊ฒฝ๋กœ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์Šค์ผˆ๋ ˆํ†ค ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ํŒŒ์ผ์˜ ์ •ํ™•ํ•œ ์œ„์น˜์™€ ์ด๋ฆ„์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. +- **์ตœ์†Œ์ฃผ์˜ ์›์น™**: ์Šค์ผˆ๋ ˆํ†ค ์ฝ”๋“œ๋Š” ํ…Œ์ŠคํŠธ์˜ ์‹คํŒจ๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด **์ตœ์†Œํ•œ์˜ ๋‚ด์šฉ**๋งŒ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +#### ํ•จ์ˆ˜ ์Šค์ผˆ๋ ˆํ†ค ์˜ˆ์‹œ + +ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ `string[]`์„ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜๋Š” ํ•จ์ˆ˜๋Š” ๋นˆ ๋ฐฐ์—ด `[]`์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. + +```typescript +// src/utils/myFunction.ts + +export const myFunction = (arg1: string): string[] => { + // Hermes๊ฐ€ ์ด ๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ•  ์˜ˆ์ • + return []; +}; +``` + +#### ์ปดํฌ๋„ŒํŠธ ์Šค์ผˆ๋ ˆํ†ค ์˜ˆ์‹œ + +React ์ปดํฌ๋„ŒํŠธ๋Š” `null` ๋˜๋Š” ์ตœ์†Œํ•œ์˜ `div`๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ž‘์„ฑํ•˜์—ฌ ๋ Œ๋”๋ง์€ ๋˜์ง€๋งŒ ๋‚ด์šฉ์€ ์—†๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. + +```typescript +// src/components/MyComponent.tsx + +import React from 'react'; + +const MyComponent: React.FC = () => { + // Hermes๊ฐ€ ์ด ๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ•  ์˜ˆ์ • + return
; // ๋˜๋Š” return null; +}; + +export default MyComponent; +``` + +### ๐Ÿš€ Vitest ๋ฐ React Testing Library (RTL) ์ฒ ํ•™ ๋ฐ ๋ชจ๋ฒ” ์‚ฌ๋ก€ + +#### Vitest์˜ ์ฒ ํ•™ + +Vitest๋Š” ๋น ๋ฅธ ์‹คํ–‰ ์†๋„์™€ Vite ์ƒํƒœ๊ณ„์™€์˜ ํ†ตํ•ฉ์„ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ์ฐจ์„ธ๋Œ€ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. + +- **์†๋„**: ES ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜์˜ ๋น ๋ฅธ HMR(Hot Module Replacement)์„ ํ†ตํ•ด ๊ฐœ๋ฐœ ์ค‘ ํ…Œ์ŠคํŠธ์˜ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„๋ฅผ ๋‹จ์ถ•ํ•ฉ๋‹ˆ๋‹ค. +- **์ƒํƒœ๊ณ„ ํ†ตํ•ฉ**: Vite ํ”„๋กœ์ ํŠธ์™€์˜Seamless ํ†ตํ•ฉ์„ ์ œ๊ณตํ•˜์—ฌ ๋ณ„๋„์˜ ์„ค์ • ์—†์ด ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- **๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜**: Jest์™€ ์œ ์‚ฌํ•œ API๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๊ธฐ์กด Jest ์‚ฌ์šฉ์ž์—๊ฒŒ ์นœ์ˆ™ํ•˜๋ฉฐ, TypeScript ์ง€์›์„ ๊ธฐ๋ณธ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. + +#### React Testing Library (RTL)์˜ ์ฒ ํ•™ + +RTL์€ "์‚ฌ์šฉ์ž๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹๋Œ€๋กœ ํ…Œ์ŠคํŠธํ•˜๋ผ"๋Š” ์ฒ ํ•™์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. + +- **์‚ฌ์šฉ์ž ์ค‘์‹ฌ ํ…Œ์ŠคํŠธ**: ์ปดํฌ๋„ŒํŠธ์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„ ๋””ํ…Œ์ผ๋ณด๋‹ค๋Š” ์‚ฌ์šฉ์ž์˜ ์ธํ„ฐ๋ž™์…˜๊ณผ ์ ‘๊ทผ์„ฑ์— ์ดˆ์ ์„ ๋‘ก๋‹ˆ๋‹ค. `getByRole`, `getByLabelText` ๋“ฑ ์ ‘๊ทผ์„ฑ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์†Œ๋ฅผ ์ฐพ๋Š” ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค. +- **๋ฆฌํŒฉํ† ๋ง ๋‚ด์„ฑ**: ๊ตฌํ˜„ ๋””ํ…Œ์ผ์ด ์•„๋‹Œ ์‚ฌ์šฉ์ž ํ–‰๋™์— ๊ธฐ๋ฐ˜ํ•œ ํ…Œ์ŠคํŠธ๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€ ๋ฆฌํŒฉํ† ๋ง ์‹œ ํ…Œ์ŠคํŠธ๊ฐ€ ๊นจ์งˆ ํ™•๋ฅ ์„ ์ค„์—ฌ์ค๋‹ˆ๋‹ค. +- **Accidental Complexity ๋ฐฉ์ง€**: ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž์ฒด๊ฐ€ ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ์„ ๊ฐ€์ง€์ง€ ์•Š๋„๋ก ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ธ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. + +### ๐Ÿ’ก ๋ชจ๋ฒ” ์‚ฌ๋ก€ (Best Practices) + +- **Given-When-Then ํŒจํ„ด ์ค€์ˆ˜**: `test_spec.md`์˜ Given-When-Then ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ๋ช…ํ™•ํ•˜๊ฒŒ ๋ฐ˜์˜ํ•˜์—ฌ ํ…Œ์ŠคํŠธ์˜ ์˜๋„๋ฅผ ๋ถ„๋ช…ํžˆ ํ•ฉ๋‹ˆ๋‹ค. + - **Given**: ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ(๋ฐ์ดํ„ฐ, ๋ชฉํ‚น, ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง)์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. + - **When**: ์‚ฌ์šฉ์ž ์•ก์…˜(ํด๋ฆญ, ์ž…๋ ฅ ๋“ฑ) ๋˜๋Š” ํŠน์ • ์ด๋ฒคํŠธ ๋ฐœ์ƒ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค. + - **Then**: ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒฐ๊ณผ(UI ๋ณ€๊ฒฝ, ํ•จ์ˆ˜ ํ˜ธ์ถœ, ์ƒํƒœ ๋ณ€ํ™” ๋“ฑ)๋ฅผ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. +- **`screen` ์ฟผ๋ฆฌ ํ™œ์šฉ**: `render` ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ์ฒด๋ณด๋‹ค๋Š” `screen` ๊ฐ์ฒด์˜ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์„œ ์ „์ฒด์—์„œ ์š”์†Œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ์œ ์‚ฌ์„ฑ์„ ๋†’์ด๊ณ  ๋ฆฌํŒฉํ† ๋ง์— ๊ฐ•ํ•ฉ๋‹ˆ๋‹ค. +- **์ ‘๊ทผ์„ฑ ์ฟผ๋ฆฌ ์šฐ์„ **: ์š”์†Œ๋ฅผ ์ฐพ์„ ๋•Œ๋Š” `getByRole`, `getByLabelText`, `getByPlaceholderText`, `getByText`, `getByDisplayValue`, `getByAltText`, `getByTitle`, `getByTestId` ์ˆœ์„œ๋กœ ์ ‘๊ทผ์„ฑ ์ฟผ๋ฆฌ๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. `data-testid`๋Š” ์ตœํ›„์˜ ์ˆ˜๋‹จ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. +- **๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ**: `waitFor`, `findBy` ์ฟผ๋ฆฌ, `async/await`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ๋™์ž‘์„ ์•ˆ์ •์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค. `act` ๋ž˜ํผ๋Š” RTL์ด ๋‚ด๋ถ€์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ, ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด ์ง์ ‘ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. +- **Mocking์˜ ์ ์ ˆํ•œ ์‚ฌ์šฉ**: API ํ˜ธ์ถœ, ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ์€ `vi.mock`์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชฉํ‚นํ•ฉ๋‹ˆ๋‹ค. ๋ชฉํ‚น์€ ํ…Œ์ŠคํŠธ ๋Œ€์ƒ์„ ๋ถ„๋ฆฌํ•˜๊ณ  ํ…Œ์ŠคํŠธ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค์ง€๋งŒ, ๋„ˆ๋ฌด ๊ณผ๋„ํ•œ ๋ชฉํ‚น์€ ์‹ค์ œ ๋™์ž‘๊ณผ ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ€์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜ํ•ฉ๋‹ˆ๋‹ค. `__mocks__` ๋””๋ ‰ํ† ๋ฆฌ์™€ `setupTest.ts`์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. +- **ํ…Œ์ŠคํŠธ ๊ฒฉ๋ฆฌ**: ๊ฐ ํ…Œ์ŠคํŠธ๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋ฉฐ, ์ด์ „ ํ…Œ์ŠคํŠธ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค์Œ ํ…Œ์ŠคํŠธ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. `beforeEach`, `afterEach` ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ ํ™˜๊ฒฝ์„ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. +- **๊ฐ„๋‹จํ•˜๊ณ  ๋ช…ํ™•ํ•œ Assertion**: ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ๊ฒ€์ฆ์€ `expect`์™€ ๋งค์ฒ˜(matcher)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๊ฒฐํ•˜๊ณ  ์˜๋ฏธ ์žˆ๊ฒŒ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. + +### ๐Ÿšซ ์•ˆํ‹ฐ ํŒจํ„ด (Anti-Patterns) + +- **๊ตฌํ˜„ ๋””ํ…Œ์ผ ํ…Œ์ŠคํŠธ**: ์ปดํฌ๋„ŒํŠธ์˜ ๋‚ด๋ถ€ ์ƒํƒœ, private ํ•จ์ˆ˜ ๋“ฑ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š” ๊ตฌํ˜„ ๋””ํ…Œ์ผ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์€ ์ง€์–‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ…Œ์ŠคํŠธ๋Š” ๋ฆฌํŒฉํ† ๋ง ์‹œ ์‰ฝ๊ฒŒ ๊นจ์ง€๊ณ  ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์„ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค. +- **๋ถˆํ•„์š”ํ•œ ๋ชฉํ‚น**: ๋ชจ๋“  ๊ฒƒ์„ ๋ชฉํ‚นํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์ž‘์„ ์ œ๋Œ€๋กœ ๋ฐ˜์˜ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ Prop ๋“œ๋ฆด๋ง(prop drilling)๊ณผ ๊ฐ™์€ ์ƒํƒœ ์ „๋‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋ชฉํ‚นํ•˜๋Š” ๊ฒƒ์€ ํ”ผํ•ฉ๋‹ˆ๋‹ค. +- **`wrapper.find`์™€ ๊ฐ™์€ ๋‚ด๋ถ€ ์ฟผ๋ฆฌ ์‚ฌ์šฉ (Enzyme ์Šคํƒ€์ผ)**: RTL์˜ ์ฒ ํ•™์— ๋ฐ˜ํ•˜๋ฏ€๋กœ, ์ปดํฌ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค์— ์ง์ ‘ ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ๋‚ด๋ถ€ DOM ๊ตฌ์กฐ์— ์˜์กดํ•˜๋Š” ํ…Œ์ŠคํŠธ๋Š” ํ”ผํ•ฉ๋‹ˆ๋‹ค. +- **SnapShot ํ…Œ์ŠคํŠธ ๋‚จ์šฉ**: Snapshot ํ…Œ์ŠคํŠธ๋Š” UI๊ฐ€ ์˜๋„์น˜ ์•Š๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜์ง€๋งŒ, ๋‚จ์šฉํ•˜๊ฑฐ๋‚˜ ์ƒ์„ธํ•œ ์ƒํ˜ธ์ž‘์šฉ ๊ฒ€์ฆ ์—†์ด ์Šค๋ƒ…์ƒท์—๋งŒ ์˜์กดํ•˜๋Š” ๊ฒƒ์€ ์ง€์–‘ํ•ฉ๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๋กœ์ง์€ ์‚ฌ์šฉ์ž ํ–‰๋™์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฒ€์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **๋งˆ๋ฒ•์˜ ์ˆซ์ž/๋ฌธ์ž์—ด**: ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋‚ด์— ์ž„์˜์˜ ์ƒ์ˆ˜๋‚˜ ๋ฌธ์ž์—ด์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹ , ์˜๋ฏธ ์žˆ๋Š” ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜๋ฅผ ์ •์˜ํ•˜์—ฌ ๊ฐ€๋…์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค. +- **๋ถˆ์•ˆ์ •ํ•œ ํ…Œ์ŠคํŠธ (Flaky Tests)**: ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฏธํก, ํ™˜๊ฒฝ ์„ค์ • ๋ฌธ์ œ ๋“ฑ์œผ๋กœ ์ธํ•ด ์„ฑ๊ณต๊ณผ ์‹คํŒจ๊ฐ€ ๋ฐ˜๋ณต๋˜๋Š” ํ…Œ์ŠคํŠธ๋Š” ์ž‘์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ์‹ ๋ขฐ๋„๋ฅผ ๋–จ์–ด๋œจ๋ฆฝ๋‹ˆ๋‹ค. diff --git a/docs/guides/zeus_guide.md b/docs/guides/zeus_guide.md new file mode 100644 index 00000000..fbd1f71a --- /dev/null +++ b/docs/guides/zeus_guide.md @@ -0,0 +1,94 @@ +# ๐Ÿ“š Zeus ์—์ด์ „ํŠธ ์ž‘์—… ๊ฐ€์ด๋“œ๋ผ์ธ + +์ด ๋ฌธ์„œ๋Š” Zeus ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๊ณตํ†ต์ ์œผ๋กœ ์ค€์ˆ˜ํ•ด์•ผ ํ•  ๊ฐ€์ด๋“œ๋ผ์ธ๊ณผ ๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ TDD ๊ฐœ๋ฐœ ํŒŒ์ดํ”„๋ผ์ธ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜์˜ ์ฒ ํ•™ ๋ฐ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 1. ๐ŸŽฏ ์ž‘์—…์˜ ๋ชฉ์  ๋ฐ ์—ญํ•  ์ดํ•ด + +- **`agents_spec.md` ์ˆ™์ง€**: Zeus๋Š” ๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ TDD ์‹œ์Šคํ…œ์˜ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ๋กœ์„œ, ์ „์ฒด ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ œ์–ดํ•˜๊ณ , ๊ฐ ์—์ด์ „ํŠธ์˜ ์ƒํƒœ๋ฅผ ๊ฐ์‹œํ•˜๋ฉฐ, ๋‹จ๊ณ„ ์ „ํ™˜ ๋ฐ ๋กœ๊ทธ ๊ด€๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. +- **ํŽ˜๋ฅด์†Œ๋‚˜ ์ค€์ˆ˜**: Zeus๋Š” "์ œ์šฐ์Šค (์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ)"๋กœ์„œ, ์‹œ์Šคํ…œ์˜ ์•ˆ์ •์ ์ธ ์šด์˜๊ณผ ํšจ์œจ์ ์ธ TDD ์‚ฌ์ดํด ์ง„ํ–‰์„ ์ตœ์šฐ์„ ์œผ๋กœ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. +- **TDD ์‚ฌ์ดํด ๊ธฐ์—ฌ**: ์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ์„ ์ตœ์ข…์ ์œผ๋กœ ๊ตฌํ˜„๋œ, ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผ๋œ, ๋ฆฌํŒฉํ† ๋ง๋œ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ „์ฒด TDD ์‚ฌ์ดํด์˜ ์„ฑ๊ณต์ ์ธ ์™„๋ฃŒ๋ฅผ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. + +## 2. ๐Ÿ“ฅ ์ž…๋ ฅ ์ฒ˜๋ฆฌ ์›์น™ + +- **์ž…๋ ฅ ํŒŒ์ผ ์œ ํšจ์„ฑ ๊ฒ€์ฆ**: ์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ ๋ฐ `context.md` ํŒŒ์ผ์ด ์กด์žฌํ•˜๋ฉฐ, ๋‚ด์šฉ์ด ๋น„์–ด์žˆ์ง€ ์•Š์€์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. +- **๊ตฌ์กฐ ๋ฐ ํ˜•์‹ ๋ถ„์„**: `context.md`์˜ ํ˜„์žฌ ์ƒํƒœ, ๋‹จ๊ณ„, ์—์ด์ „ํŠธ๋ณ„ ์™„๋ฃŒ ์—ฌ๋ถ€ ๋“ฑ์„ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•˜์—ฌ ์›Œํฌํ”Œ๋กœ์šฐ ์ง„ํ–‰์˜ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ผ์Šต๋‹ˆ๋‹ค. +- **๋ˆ„๋ฝ/์˜ค๋ฅ˜ ๋Œ€์‘**: ์ž…๋ ฅ ๋‚ด์šฉ์ด ๋ถˆ์™„์ „ํ•˜๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์‹œ์ž‘ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ค‘๋‹จํ•˜๊ณ  ๋ช…ํ™•ํ•œ ์˜ค๋ฅ˜ ์ƒํ™ฉ์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. + +## 3. ๐Ÿ“ค ์ถœ๋ ฅ ์ƒ์„ฑ ์›์น™ + +- **๋ช…์„ธ ์ค€์ˆ˜**: `context.md` ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ , `docs/sessions/tdd_YYYY-MM-DD_NNN/` ๊ฒฝ๋กœ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. Markdown ํ˜•์‹๊ณผ ์ฝ”๋“œ ๋ธ”๋ก ์–ธ์–ด ์ง€์ •์„ ์—„๊ฒฉํžˆ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. +- **๋ช…ํ™•์„ฑ ๋ฐ ๊ฐ„๊ฒฐ์„ฑ**: `context.md`๋Š” ์‹œ์Šคํ…œ์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋ฐ˜์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **์™„์ „์„ฑ**: ๊ฐ ์—์ด์ „ํŠธ์˜ ์ž‘์—… ์™„๋ฃŒ ์—ฌ๋ถ€, ํ˜„์žฌ ๋‹จ๊ณ„, ์ „์ฒด ์ƒํƒœ ๋“ฑ์„ ๋น ์ง์—†์ด ํฌํ•จํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ํˆฌ๋ช…์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. + +## 4. ๐Ÿ”„ ์ปจํ…์ŠคํŠธ ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ + +- **`context.md` ๊ด€๋ฆฌ**: `context.md` ํŒŒ์ผ์€ Zeus๋งŒ์ด ๊ด€๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ์˜ ํ•ต์‹ฌ ์ƒํƒœ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค. ๊ฐ ์—์ด์ „ํŠธ์˜ ์ž‘์—… ์™„๋ฃŒ ๋ฐ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ `context.md`์˜ ์ƒํƒœ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **Zeus์˜ ์ „ํ™˜ ์กฐ๊ฑด ์ถฉ์กฑ**: ๊ฐ ์—์ด์ „ํŠธ์˜ ์ž‘์—… ์™„๋ฃŒ ํ›„, `agents_spec.md`์— ๋ช…์‹œ๋œ ์ „ํ™˜ ์กฐ๊ฑด(์˜ˆ: ํŠน์ • ํŒŒ์ผ ์ƒ์„ฑ ํ™•์ธ, ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ์—ฌ๋ถ€)์„ ๊ฐ์ง€ํ•˜๊ณ  ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ํ•„์š”ํ•œ ์‚ฐ์ถœ๋ฌผ์„ ์ •ํ™•ํžˆ ์ƒ์„ฑํ–ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. + +## 5. โœจ ํ’ˆ์งˆ ๋ฐ ํ‘œ์ค€ ์ค€์ˆ˜ + +- **๋†’์€ ํ’ˆ์งˆ์˜ ์‚ฐ์ถœ๋ฌผ**: `context.md` ๋‚ด์˜ ๋‚ด์šฉ์€ ์˜คํƒˆ์ž, ๋ฌธ๋ฒ• ์˜ค๋ฅ˜, ๋…ผ๋ฆฌ์  ๋น„์•ฝ ์—†์ด ๋†’์€ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **๋ณด์•ˆ ๊ณ ๋ ค**: ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ `context.md`์— ํฌํ•จ๋˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ฉ๋‹ˆ๋‹ค. +- **์ฐธ์กฐ ์œ ํšจ์„ฑ**: `context.md` ๋‚ด๋ถ€์— ๋‹ค๋ฅธ ํŒŒ์ผ์ด๋‚˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋งํฌ๊ฐ€ ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ๋งํฌ๊ฐ€ ์œ ํšจํ•˜๊ณ  ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. + +## 6. ๐Ÿšจ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฐ ๋ณด๊ณ  (Zeus ์—ฐ๋™) + +- **์˜ค๋ฅ˜ ๊ฐ์ง€**: ์—์ด์ „ํŠธ ์ž‘์—… ์‹คํŒจ, ํ…Œ์ŠคํŠธ ์‹คํŒจ, `context.md` ์†์ƒ ๋“ฑ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ œ๋ฅผ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค. +- **Zeus ๋ณด๊ณ  ๋ฉ”์ปค๋‹ˆ์ฆ˜**: ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ค‘๋‹จํ•˜๊ณ , ์ƒ์„ธ ์˜ค๋ฅ˜ ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•˜๋ฉฐ, ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹คํŒจ๋ฅผ ๋ช…ํ™•ํžˆ ์•Œ๋ฆฝ๋‹ˆ๋‹ค. + +--- + +## ๐Ÿ“ ๊ฐœ๋ณ„ ์—์ด์ „ํŠธ ๊ฐ€์ด๋“œ๋ผ์ธ: Zeus (์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ) + +### ๐Ÿš€ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์ฒ ํ•™ ๋ฐ ๋ชจ๋ฒ” ์‚ฌ๋ก€ + +Zeus์˜ ํ•ต์‹ฌ ์—ญํ• ์€ ๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ ์‹œ์Šคํ…œ์˜ ์‹ฌ์žฅ์œผ๋กœ์„œ, TDD ์‚ฌ์ดํด์˜ ๊ฐ ๋‹จ๊ณ„๋ฅผ ์•ˆ์ •์ ์ด๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ด๋„๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. + +- **๋‹จ์ผ ์ฑ…์ž„ ์›์น™ (SRP) ์ค€์ˆ˜**: Zeus๋Š” ์˜ค์ง ์›Œํฌํ”Œ๋กœ์šฐ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜์—๋งŒ ์ง‘์ค‘ํ•˜๋ฉฐ, ๊ฐœ๋ณ„ ์—์ด์ „ํŠธ์˜ ๋‚ด๋ถ€ ๋กœ์ง์—๋Š” ๊ด€์—ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. +- **๋ช…ํ™•ํ•œ ๊ณ„์•ฝ ๊ธฐ๋ฐ˜ ์ƒํ˜ธ์ž‘์šฉ**: ๊ฐ ์—์ด์ „ํŠธ์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์€ `agents_spec.md`์— ์ •์˜๋œ ์ž…๋ ฅ/์ถœ๋ ฅ ๊ณ„์•ฝ์„ ์—„๊ฒฉํžˆ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. +- **์ƒํƒœ ์ค‘์‹ฌ ๊ด€๋ฆฌ**: `context.md`๋ฅผ ํ†ตํ•ด ์‹œ์Šคํ…œ์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์ค‘์•™ ์ง‘์ค‘์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ชจ๋“  ์˜์‚ฌ๊ฒฐ์ •์„ ๋‚ด๋ฆฝ๋‹ˆ๋‹ค. + +### ๐Ÿ’ก ๋ชจ๋ฒ” ์‚ฌ๋ก€ (Best Practices) + +- **์›Œํฌํ”Œ๋กœ์šฐ ๊ฐ€์‹œ์„ฑ**: `context.md`๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ๋‹จ๊ณ„, ๊ฐ ์—์ด์ „ํŠธ์˜ ์™„๋ฃŒ ์ƒํƒœ, ์ „์ฒด ์›Œํฌํ”Œ๋กœ์šฐ์˜ ์ง„ํ–‰ ์ƒํ™ฉ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. +- **์ •ํ™•ํ•œ ์ƒํƒœ ๊ธฐ๋ก**: `last_updated` ๋ฐ ๊ฐ ์—์ด์ „ํŠธ์˜ `์™„๋ฃŒ ์‹œ๊ฐ„`์„ ์—…๋ฐ์ดํŠธํ•  ๋•Œ๋Š”, **๋ฐ˜๋“œ์‹œ ํ˜„์žฌ ์‹œ์Šคํ…œ์˜ ์ •ํ™•ํ•œ ์‹œ๊ฐ„**์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ๊ฐ’์„ ์žฌ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ถ€์ •ํ™•ํ•œ ์‹œ๊ฐ„์„ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์€ ์›Œํฌํ”Œ๋กœ์šฐ์˜ ์‹ ๋ขฐ์„ฑ์„ ์‹ฌ๊ฐํ•˜๊ฒŒ ํ›ผ์†ํ•˜๋Š” ํ–‰์œ„์ž…๋‹ˆ๋‹ค. +- **์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ ๊ฒ€์ฆ**: Hermes ๋ฐ Apollo ๋‹จ๊ณ„ ์™„๋ฃŒ ํ›„ `pnpm run test`๋ฅผ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•˜์—ฌ ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ณ , ์ด๋ฅผ ๋‹ค์Œ ๋‹จ๊ณ„ ์ „ํ™˜์˜ ํ•ต์‹ฌ ์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, `pnpm run test` ์Šคํฌ๋ฆฝํŠธ์—๋Š” ์ฝ”๋“œ ํฌ๋งทํŒ…(`prettier --write .`) ๋ฐ ๋ฆฐํŠธ ์ž๋™ ์ˆ˜์ •(`eslint --fix`) ๊ณผ์ •์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด, ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์ „์— ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์ž๋™์œผ๋กœ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค. +- **๋กœ๊ทธ ๋ฐ ์ถ”์ **: ๊ฐ ์—์ด์ „ํŠธ์˜ ํ˜ธ์ถœ, ์ž…๋ ฅ, ์ถœ๋ ฅ, ์‹คํ–‰ ์‹œ๊ฐ„, ์„ฑ๊ณต/์‹คํŒจ ์—ฌ๋ถ€ ๋“ฑ ๋ชจ๋“  ์ค‘์š”ํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ธํ•˜๊ฒŒ ๋กœ๊น…ํ•˜์—ฌ ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ๋””๋ฒ„๊น…์„ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. +- **์žฌ์‹œ๋„ ๋ฐ ๋ณต๊ตฌ ์ „๋žต**: (ํ–ฅํ›„ ํ™•์žฅ ์‹œ) ์ผ์‹œ์ ์ธ ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์žฌ์‹œ๋„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‚˜, ํŠน์ • ๋‹จ๊ณ„์—์„œ ์‹คํŒจํ–ˆ์„ ๋•Œ์˜ ๋ณต๊ตฌ ์ „๋žต์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. +- **์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„**: ๊ฐ ๋‹จ๊ณ„์˜ ์ง„ํ–‰ ์ƒํ™ฉ ๋ฐ ์™„๋ฃŒ ์—ฌ๋ถ€๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ช…ํ™•ํ•˜๊ฒŒ ์ „๋‹ฌํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ํˆฌ๋ช…์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค. +- **๋‹จ๊ณ„๋ณ„ Git ์ปค๋ฐ‹ ๊ฐ•์ œ**: ๊ฐ ์—์ด์ „ํŠธ์˜ ๋‹จ๊ณ„ ์™„๋ฃŒ๋ฅผ ๋ช…ํ™•ํ•œ ๋ฒ„์ „์œผ๋กœ ๊ธฐ๋กํ•˜๊ณ , ์ž‘์—…์˜ ์›์ž์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด **๋‹จ๊ณ„๋ณ„ Git ์ปค๋ฐ‹์€ ์„ ํƒ์ด ์•„๋‹Œ ํ•„์ˆ˜ ์‚ฌํ•ญ**์ž…๋‹ˆ๋‹ค. ๊ฐ ์—์ด์ „ํŠธ์˜ ์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜๊ณ  ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ „ํ™˜๋˜๊ธฐ ์ „์—, ํ•ด๋‹น ๋‹จ๊ณ„์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ช…์‹œ์ ์œผ๋กœ `git commit`ํ•˜๋„๋ก ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” `ccundo`์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ†ตํ•œ ๋˜๋Œ๋ฆฌ๊ธฐ ๋ฐฉ์‹์ด ์•„๋‹Œ, ๋ช…์‹œ์ ์ธ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ณ€๊ฒฝ ์ด๋ ฅ์„ ํˆฌ๋ช…ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ์ถ”์  ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค. + - **์ปค๋ฐ‹ ๋Œ€์ƒ**: ํ˜„์žฌ ์—์ด์ „ํŠธ๊ฐ€ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•œ ๋ชจ๋“  ๊ด€๋ จ ํŒŒ์ผ. + - **์ปค๋ฐ‹ ๋ธŒ๋žœ์น˜**: `main` ๋ธŒ๋žœ์น˜์— ์ง์ ‘ ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค. + - **์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ํ˜•์‹**: `[type]([AgentName]): [Session ID] [Stage Description]`์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. + - `type`: `feat`, `fix`, `docs`, `test`, `refactor` ๋“ฑ ์ ์ ˆํ•œ Git ์ปค๋ฐ‹ ํƒ€์ž… ์‚ฌ์šฉ. + - `AgentName`: ํ•ด๋‹น ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ ์—์ด์ „ํŠธ์˜ ์ด๋ฆ„ (์˜ˆ: `Athena`, `Artemis`, `Poseidon`, `Hermes`, `Apollo`). + - `Stage Description`: ํ•ด๋‹น ์—์ด์ „ํŠธ๊ฐ€ ์™„๋ฃŒํ•œ ๋‹จ๊ณ„์— ๋Œ€ํ•œ ๊ฐ„๊ฒฐํ•œ ์„ค๋ช… (์˜ˆ: `๊ธฐ๋Šฅ ๋ช…์„ธ ์ž‘์„ฑ ์™„๋ฃŒ`, `ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ์™„๋ฃŒ (Red)`). + - **์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์˜ˆ์‹œ**: + - `docs(Athena): tdd_2025-10-30_001 ๊ธฐ๋Šฅ ๋ช…์„ธ ์ž‘์„ฑ ์™„๋ฃŒ` + - `test(Poseidon): tdd_2025-10-30_001 ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ์™„๋ฃŒ (Red)` + - `feat(Hermes): tdd_2025-10-30_001 ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์™„๋ฃŒ (Green)` + - `refactor(Apollo): tdd_2025-10-30_001 ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง ๋ฐ ๋ณด๊ณ ์„œ ์ž‘์„ฑ ์™„๋ฃŒ` + +### ๐Ÿšซ ์•ˆํ‹ฐ ํŒจํ„ด (Anti-Patterns) + +- **์—์ด์ „ํŠธ ๋‚ด๋ถ€ ๋กœ์ง ๊ฐœ์ž…**: ๊ฐœ๋ณ„ ์—์ด์ „ํŠธ์˜ ์ƒ์„ธ ๊ตฌํ˜„ ๋กœ์ง์— ์ง์ ‘ ๊ฐœ์ž…ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ Zeus์˜ ์—ญํ•  ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฉ๋‹ˆ๋‹ค. +- **๋ณ‘๋ ฌ ์‹คํ–‰ ์‹œ๋„**: `agents_spec.md`์— ๋ช…์‹œ๋œ "์™„์ „ํ•œ ์ˆœ์ฐจ ์‹คํ–‰ (๋ณ‘๋ ฌ ๊ธˆ์ง€)" ์›์น™์„ ์œ„๋ฐ˜ํ•˜์—ฌ ์—์ด์ „ํŠธ๋ฅผ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์‹œ์Šคํ…œ์˜ ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค. +- **`context.md`์˜ ๋ถˆ์ผ์น˜**: `context.md`์˜ ์ƒํƒœ๊ฐ€ ์‹ค์ œ ์›Œํฌํ”Œ๋กœ์šฐ ์ง„ํ–‰ ์ƒํ™ฉ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋„๋ก ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์‹œ์Šคํ…œ์˜ ์‹ ๋ขฐ์„ฑ์„ ์ €ํ•ดํ•ฉ๋‹ˆ๋‹ค. +- **๋ถˆ๋ช…ํ™•ํ•œ ์ „ํ™˜ ์กฐ๊ฑด**: ๋‹ค์Œ ๋‹จ๊ณ„๋กœ์˜ ์ „ํ™˜ ์กฐ๊ฑด์ด ๋ชจํ˜ธํ•˜๊ฑฐ๋‚˜, ํŠน์ • ์—์ด์ „ํŠธ์˜ ์‚ฐ์ถœ๋ฌผ์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ๊ฒ€์ฆ ์—†์ด ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค. +- **ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ๋ฌด์‹œ**: `pnpm run test`์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์€ TDD ์‚ฌ์ดํด์˜ ํ•ต์‹ฌ ์›์น™์„ ํ›ผ์†ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## ๐Ÿ“š ๊ด€๋ จ ๋ฌธ์„œ ๋ฐ ์ฐธ์กฐ + +- **`agents_spec.md`**: ์‹œ์Šคํ…œ ์ „์ฒด ๋ช…์„ธ (Zeus์˜ ์„ค๊ณ„๋„) +- **`zeus_card.md`**: Zeus ์—์ด์ „ํŠธ ์นด๋“œ +- **`zeus_checklist.md`**: Zeus ์—์ด์ „ํŠธ ์ž‘์—… ์ฒดํฌ๋ฆฌ์ŠคํŠธ +- **`context.md`**: Zeus๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ ์ƒํƒœ ๋ฌธ์„œ +- **`feature_spec.md`**: Athena์˜ ์ถœ๋ ฅ ํŒŒ์ผ +- **`test_spec.md`**: Artemis์˜ ์ถœ๋ ฅ ํŒŒ์ผ +- **`test_code.md`**: Poseidon์˜ ์ถœ๋ ฅ ํŒŒ์ผ +- **`impl_code.md`**: Hermes์˜ ์ถœ๋ ฅ ํŒŒ์ผ +- **`refactor_report.md`**: Apollo์˜ ์ถœ๋ ฅ ํŒŒ์ผ diff --git a/docs/system/agents_spec.md b/docs/system/agents_spec.md new file mode 100644 index 00000000..fb280276 --- /dev/null +++ b/docs/system/agents_spec.md @@ -0,0 +1,264 @@ +# ๐Ÿง  Multi-Agent TDD System Specification + +> **๋ชฉ์ **: +> ์ด ๋ฌธ์„œ๋Š” **Zeus(์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ)**๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ TDD ๊ฐœ๋ฐœ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ „์ฒด ๊ตฌ์กฐ, ์—ญํ• , ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๋ฐ ์‚ฐ์ถœ๋ฌผ์„ ๋ช…์„ธํ•œ๋‹ค. +> ๋ชจ๋“  ์—์ด์ „ํŠธ๋Š” ์ด ์ •์˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ˜‘์—…ํ•˜๋ฉฐ, ์ž…๋ ฅยท์ถœ๋ ฅ ํฌ๋งท์„ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค. + +--- + +## ๐Ÿ›๏ธ 1. ์‹œ์Šคํ…œ ๊ฐœ์š” + +์ด ์‹œ์Šคํ…œ์€ ์ด 6๊ฐœ์˜ ์—์ด์ „ํŠธ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, **TDD ์‚ฌ์ดํด์„ ์ž๋™ํ™”**ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ๋‹ค. +๊ฐ ์—์ด์ „ํŠธ๋Š” ํŠน์ • ์—ญํ• ์— ํŠนํ™”๋œ ํŽ˜๋ฅด์†Œ๋‚˜(Persona)๋ฅผ ๊ฐ€์ง€๊ณ , Zeus์˜ ์ง€์‹œ์— ๋”ฐ๋ผ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค. + +### ๐Ÿงฉ 1.1 ์ฃผ์š” ํŠน์ง• + +- ํŒŒ์ผ ๊ธฐ๋ฐ˜ ์ปจํ…์ŠคํŠธ ๊ณต์œ  (Markdown ๋ฌธ์„œ๋กœ ์ƒํƒœ ์ „๋‹ฌ) +- ์™„์ „ํ•œ ์ˆœ์ฐจ ์‹คํ–‰ (๋ณ‘๋ ฌ ๊ธˆ์ง€) +- Zeus ์ค‘์‹ฌ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ +- ๊ฐ ๋‹จ๊ณ„๋ณ„ ๋ช…ํ™•ํ•œ ์ž…๋ ฅ/์ถœ๋ ฅ ๊ณ„์•ฝ (Input/Output Contract) + +--- + +## ๐Ÿงฉ 2. ์ฃผ์š” ์‚ฐ์ถœ๋ฌผ ์ •์˜ (Markdown ํŒŒ์ผ ๊ตฌ์กฐ) + +| ํŒŒ์ผ๋ช… | ์ž‘์„ฑ ์ฃผ์ฒด | ๋ชฉ์  ๋ฐ ๋‚ด์šฉ ์š”์•ฝ | +| ---------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------- | +| **context.md** | Zeus | ์ „์ฒด ์ง„ํ–‰ ์ƒํƒœ, ํ˜„์žฌ ๋‹จ๊ณ„, ์—์ด์ „ํŠธ๋ณ„ ์™„๋ฃŒ ์—ฌ๋ถ€๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋ฉ”์ธ ์ƒํƒœ ๋ฌธ์„œ | +| **feature_spec.md** | Athena | ์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ถ„์„ํ•˜์—ฌ ๊ธฐ๋Šฅ ๋ช…์„ธ(PRD ์ˆ˜์ค€)๋กœ ์ •์˜ํ•˜๋Š” ๋ฌธ์„œ | +| **test_spec.md** | Artemis | ํ…Œ์ŠคํŠธ ์ „๋žต, ์‹œ๋‚˜๋ฆฌ์˜ค, ์ผ€์ด์Šค(Given-When-Then) ๋“ฑ์„ ํ†ตํ•ฉํ•˜์—ฌ ์ •์˜ํ•˜๋Š” ๋ฌธ์„œ + ๋นˆ describe/it ์ฝ”๋“œ๋ธ”๋ก ํฌํ•จ | +| **test_code.md** | Poseidon | `Vitest + React Testing Library(RTL)` ๊ธฐ๋ฐ˜์˜ ์‹ค์ œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ํŒŒ์ผ + Artemis๊ฐ€ ๋งŒ๋“  ์ฝ”๋“œ๋ธ”๋ก ๋‚ด๋ถ€์— ์‹ค์ œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ | +| **impl_code.md** | Hermes | ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๋Š” ์‹ค์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์ฝ”๋“œ + ์‹ค์ œ ๊ธฐ๋Šฅ ์†Œ์Šค์ฝ”๋“œ ์ž‘์„ฑ | +| **refactor_report.md** | Apollo | ๋ฆฌํŒฉํ† ๋ง๋œ ์ฝ”๋“œ, ๊ฐœ์„ ๋œ ์„ค๊ณ„, ๋ณ€๊ฒฝ ์ด์œ  ๋“ฑ์„ ์ •๋ฆฌํ•œ ๋ฌธ์„œ + Hermes ์ฝ”๋“œ ์‹ค์ œ ๋ฆฌํŒฉํ† ๋ง ์ˆ˜ํ–‰ | + +--- + +## โš™๏ธ 3. ์—์ด์ „ํŠธ ์‚ฌ์–‘ ์ •์˜ + +| # | ์—์ด์ „ํŠธ๋ช… | ํŽ˜๋ฅด์†Œ๋‚˜ | ์ฃผ์š” ์—ญํ•  | ์ž…๋ ฅ | ์ถœ๋ ฅ | +| --- | ------------ | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------ | ---------------------------------------- | +| 1 | **Zeus** | ์ œ์šฐ์Šค (์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ) | ์ „์ฒด ์›Œํฌํ”Œ๋กœ์šฐ ์ œ์–ด, ์ƒํƒœ ๊ฐ์‹œ, ๋‹จ๊ณ„ ์ „ํ™˜, ๋กœ๊ทธ ๊ด€๋ฆฌ, ๊ฐ ๋‹จ๊ณ„ ์™„๋ฃŒ ํ›„ `pnpm run test` ์‹คํ–‰: Artemis / Poseidon ๋‹จ๊ณ„ ์‹คํŒจ, Hermes / Apollo ๋‹จ๊ณ„ ์„ฑ๊ณต, **๊ฐ ๋‹จ๊ณ„ ์™„๋ฃŒ ์‹œ ์ •ํ™•ํ•œ ํ˜„์žฌ ์‹œ๊ฐ„ ๊ธฐ๋ก ๋ฐ ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ Git ์ปค๋ฐ‹ ์ˆ˜ํ–‰** | ์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ / context.md | context.md (์ƒํƒœ ์—…๋ฐ์ดํŠธ) | +| 2 | **Athena** | ์•„ํ…Œ๋„ค (์ง€ํ˜œ์™€ ์ „๋žต์˜ ์—ฌ์‹ ) | ๊ธฐ๋Šฅ ๋ช…์„ธ ์ž‘์„ฑ (PRD ์ˆ˜์ค€์˜ ์ƒ์„ธ ๋ช…์„ธ) | ์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ / context.md | feature_spec.md | +| 3 | **Artemis** | ์•„๋ฅดํ…Œ๋ฏธ์Šค (์ •ํ™•์„ฑ๊ณผ ํ†ต์ฐฐ์˜ ์—ฌ์‹ ) | ํ…Œ์ŠคํŠธ ์„ค๊ณ„ (์‹œ๋‚˜๋ฆฌ์˜ค ๋ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๋ช…์„ธ), ๋นˆ describe/it ์ฝ”๋“œ๋ธ”๋ก ์ƒ์„ฑ ํฌํ•จ | feature_spec.md | test_spec.md | +| 4 | **Poseidon** | ํฌ์„ธ์ด๋ˆ (ํ…Œ์ŠคํŠธ์˜ ์ˆ˜ํ˜ธ์ž) | ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ (`Vitest + RTL` ๊ธฐ๋ฐ˜ ์ฝ”๋“œ ์ƒ์„ฑ), Artemis ์ฝ”๋“œ๋ธ”๋ก ๋‚ด๋ถ€์— ์‹ค์ œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ, **ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ์ฝ”๋“œ ์Šค์ผˆ๋ ˆํ†ค ํŒŒ์ผ ์ƒ์„ฑ** | test_spec.md | test_code.md | +| 5 | **Hermes** | ํ—ค๋ฅด๋ฉ”์Šค (์ „๋‹ฌ์ž, ๊ตฌํ˜„์˜ ์‹ ) | ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๋Š” ์‹ค์ œ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž‘์„ฑ, ์‹ค์ œ ๊ธฐ๋Šฅ ์†Œ์Šค์ฝ”๋“œ ์ž‘์„ฑ | test_code.md / feature_spec.md | impl_code.md | +| 6 | **Apollo** | ์•„ํด๋กœ (์˜ˆ์ˆ ๊ณผ ์™„์„ฑ์˜ ์‹ ) | ๋ฆฌํŒฉํ† ๋ง ๋ฐ ์ฝ”๋“œ ๊ฐœ์„ , ํ…Œ์ŠคํŠธ ์œ ์ง€ , Hermes ์ฝ”๋“œ ์‹ค์ œ ๋ฆฌํŒฉํ† ๋ง ์ˆ˜ํ–‰ | impl_code.md / test_code.md | refactor_report.md / ๊ฐœ์„ ๋œ impl_code.md | + +--- + +## ๐Ÿงฉ 4. ์›Œํฌํ”Œ๋กœ์šฐ ๊ฐœ์š” (Zeus ๊ธฐ์ค€) + +Zeus๋Š” ๋ชจ๋“  ์ž‘์—…์˜ ์ค‘์‹ฌ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. + +``` +User ์ž…๋ ฅ โ†’ Zeus โ†’ Athena โ†’ Artemis โ†’ Poseidon โ†’ Hermes โ†’ Apollo โ†’ ์™„๋ฃŒ +``` + +### 4.1 ์ „์ฒด ํ๋ฆ„ ์š”์•ฝ + +| ๋‹จ๊ณ„ | ์‹คํ–‰ ์ฃผ์ฒด | ์ž…๋ ฅ | ์ถœ๋ ฅ | Zeus์˜ ๋™์ž‘ | +| ------------------ | --------- | ------------------------------ | ------------------ | ------------------------------------------------------------------------------------------- | +| โ‘  ๊ธฐ๋Šฅ ์„ค๊ณ„ | Athena | ์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ | feature_spec.md | Zeus๊ฐ€ Athena ์™„๋ฃŒ ๊ฐ์ง€ ํ›„ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ด๋™ | +| โ‘ก ํ…Œ์ŠคํŠธ ์„ค๊ณ„ | Artemis | feature_spec.md | test_spec.md | Zeus๊ฐ€ test_spec.md ์ƒ์„ฑ ํ™•์ธ ํ›„ Poseidon ํ˜ธ์ถœ, ๋นˆ describe/it ์ฝ”๋“œ๋ธ”๋ก ์ƒ์„ฑ ํฌํ•จ | +| โ‘ข ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ | Poseidon | test_spec.md | test_code.md | Zeus๊ฐ€ test_code.md ์ƒ์„ฑ ํ™•์ธ ํ›„ Hermes ํ˜ธ์ถœ, Artemis ์ฝ”๋“œ๋ธ”๋ก ๋‚ด๋ถ€์— ์‹ค์ œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ | +| โ‘ฃ ์ฝ”๋“œ ์ž‘์„ฑ | Hermes | test_code.md / feature_spec.md | impl_code.md | Zeus๊ฐ€ impl_code.md ์ƒ์„ฑ ํ™•์ธ ํ›„ Apollo ํ˜ธ์ถœ , ์‹ค์ œ ๊ธฐ๋Šฅ ์ฝ”๋“œ ์ž‘์„ฑ ํฌํ•จ | +| โ‘ค ๋ฆฌํŒฉํ† ๋ง | Apollo | impl_code.md | refactor_report.md | Zeus๊ฐ€ ์™„๋ฃŒ ํ›„ ์ „์ฒด ์ƒํƒœ ์™„๋ฃŒ ํ‘œ์‹œ , Hermes ์ฝ”๋“œ ์‹ค์ œ ๋ฆฌํŒฉํ† ๋ง ์ˆ˜ํ–‰ ํฌํ•จ | + +--- + +## ๐Ÿ” 5. ๋‹จ๊ณ„๋ณ„ ์„ธ๋ถ€ ์‹คํ–‰ ๋กœ์ง + +### ๐ŸŸฆ 1๋‹จ๊ณ„ โ€” Athena (๊ธฐ๋Šฅ ์„ค๊ณ„) + +- **์ž…๋ ฅ:** ์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ, context.md +- **์ถœ๋ ฅ:** `feature_spec.md` +- **์—ญํ• :** + - ์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ถ„์„ํ•˜๊ณ , ๊ธฐ๋Šฅ ๋‹จ์œ„ ๋ช…์„ธ(PRD ์ˆ˜์ค€)๋กœ ๊ตฌ์กฐํ™” + - ์ž…๋ ฅ๊ฐ’ / ์ถœ๋ ฅ๊ฐ’ / ์˜ˆ์™ธ ์ƒํ™ฉ ์ •์˜ + - ์˜ํ–ฅ๋ฐ›๋Š” ๋ชจ๋“ˆ ๋ฐ ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค์™€์˜ ๊ด€๊ณ„ ๋ช…์‹œ + - TDD ๊ธฐ์ค€์œผ๋กœ โ€œํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œโ€ ๋‹จ์œ„๊นŒ์ง€ ์„ธ๋ถ„ํ™” +- **Zeus์˜ ์ „ํ™˜ ์กฐ๊ฑด:** `feature_spec.md` ํŒŒ์ผ ์ƒ์„ฑ ๋ฐ ์ƒํƒœ `โœ… done` + +--- + +### ๐ŸŸจ 2๋‹จ๊ณ„ โ€” Artemis (ํ…Œ์ŠคํŠธ ์„ค๊ณ„) + +- **์ž…๋ ฅ:** `feature_spec.md` +- **์ถœ๋ ฅ:** `test_spec.md` +- **์—ญํ• :** + - ๋ช…์„ธ๋œ ๊ธฐ๋Šฅ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค ์„ค๊ณ„ + - Given-When-Then ํ˜•์‹์˜ ๋ช…์„ธ ์ž‘์„ฑ + - ์˜ˆ์™ธ ์ผ€์ด์Šค ํฌํ•จ + - `test_spec.md` ๋ฌธ์„œ ์ƒ์„ฑ๊ณผ ๋™์‹œ์— ๋นˆ `describe`/`it` ์ฝ”๋“œ๋ธ”๋ก์„ ๋ฐ˜๋“œ์‹œ ํฌํ•จํ•ด์•ผ ํ•จ +- **Zeus์˜ ์ „ํ™˜ ์กฐ๊ฑด:** `test_spec.md` ์ƒ์„ฑ ํ™•์ธ ๋ฐ ์™„๋ฃŒ ๋กœ๊ทธ ๊ฐ์ง€ + +--- + +### ๐ŸŸฉ 3๋‹จ๊ณ„ โ€” Poseidon (ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ) + +- **์ž…๋ ฅ:** `test_spec.md` +- **์ถœ๋ ฅ:** `test_code.md`, ์‹ค์ œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ, **ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ์ฝ”๋“œ ์Šค์ผˆ๋ ˆํ†ค ํŒŒ์ผ** +- **์—ญํ• :** + - ๋ช…์„ธ๋œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ (Vitest/RTL ๋“ฑ) + - ๊ณตํ†ต ํ…Œ์ŠคํŠธ ์œ ํ‹ธ, setupTest.ts, mock ๋ฐ์ดํ„ฐ ๊ณ ๋ ค + - ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์‹œ ์‹คํŒจํ•ด์•ผ ํ•จ (TDD ์ดˆ๊ธฐ ์ƒํƒœ ์œ ์ง€) + - `test_code.md` ํŒŒ์ผ ์ƒ์„ฑ๊ณผ ๋™์‹œ์—, Artemis๊ฐ€ ๋งŒ๋“  ๋นˆ `describe`/`it` ์ฝ”๋“œ๋ธ”๋ก ๋‚ด๋ถ€์— ์‹ค์ œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ + - **ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ํ•จ์ˆ˜๋‚˜ ์ปดํฌ๋„ŒํŠธ์˜ ์Šค์ผˆ๋ ˆํ†ค ํŒŒ์ผ ์ƒ์„ฑ** +- **Zeus์˜ ์ „ํ™˜ ์กฐ๊ฑด:** `test_code.md`, **์‹ค์ œ ํ…Œ์ŠคํŠธ ํŒŒ์ผ ๋ฐ ์Šค์ผˆ๋ ˆํ†ค ํŒŒ์ผ** ์กด์žฌ ๋ฐ ์ฝ”๋“œ ๋ธ”๋ก ํฌํ•จ ํ™•์ธ, **`pnpm run test` ์‹คํ–‰ ์‹œ ํ•ด๋‹น ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•จ** + +--- + +### ๐ŸŸง 4๋‹จ๊ณ„ โ€” Hermes (์ฝ”๋“œ ์ž‘์„ฑ) + +- **์ž…๋ ฅ:** `test_code.md`, `feature_spec.md` +- **์ถœ๋ ฅ:** `impl_code.md`, ์‹ค์ œ ์ฝ”๋“œ +- **์—ญํ• :** + - ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋„๋ก ์ตœ์†Œํ•œ์˜ ๊ตฌํ˜„ + - ๊ธฐ์กด ๊ตฌ์กฐ ๋ฐ ESLint/Prettier ๊ทœ์น™ ์ค€์ˆ˜ + - ํ…Œ์ŠคํŠธ ์ˆ˜์ • ๊ธˆ์ง€ + - `impl_code.md` ๋ฌธ์„œ ์ƒ์„ฑ๊ณผ ๋™์‹œ์—, ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋„๋ก ์‹ค์ œ ๊ธฐ๋Šฅ ์ฝ”๋“œ ์ž‘์„ฑ +- **Zeus์˜ ์ „ํ™˜ ์กฐ๊ฑด:** ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ์—ฌ๋ถ€ ๋ฐ `impl_code.md` ์กด์žฌ + +--- + +### ๐ŸŸช 5๋‹จ๊ณ„ โ€” Apollo (๋ฆฌํŒฉํ† ๋ง) + +- **์ž…๋ ฅ:** `impl_code.md` +- **์ถœ๋ ฅ:** `refactor_report.md`, ์ˆ˜์ •๋œ `impl_code.md` +- **์—ญํ• :** + - ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฐœ์„  (๊ฐ€๋…์„ฑ, ์žฌ์‚ฌ์šฉ์„ฑ, ๊ตฌ์กฐ ์ •๋ฆฌ) + - ํ…Œ์ŠคํŠธ ์œ ์ง€ ๋ณด์žฅ + - ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ๊ณผ ์ด์œ ๋ฅผ `refactor_report.md`์— ๋ฌธ์„œํ™” + - `refactor_report.md` ์ƒ์„ฑ๊ณผ ๋™์‹œ์— Hermes๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ์‹ค์ œ ๋ฆฌํŒฉํ† ๋ง ์ˆ˜ํ–‰ +- **Zeus์˜ ์ „ํ™˜ ์กฐ๊ฑด:** ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ๋ฐ ์ƒํƒœ `โœ… done` + +--- + +## ๐Ÿงฉ 6. Zeus์˜ ๋‚ด๋ถ€ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๋กœ์ง (๊ฐœ๋…์ ) + +``` +load(context.md) + +while overall_status != "completed": + current_stage = context.current_stage + + if current_stage == "Athena": + run(Athena) + wait_for(feature_spec.md) + mark_done("Athena") + next_stage("Artemis") + + elif current_stage == "Artemis": + run(Artemis) + wait_for(test_spec.md) + mark_done("Artemis") + next_stage("Poseidon") + + elif current_stage == "Poseidon": + run(Poseidon) + wait_for(test_code.md) + mark_done("Poseidon") + next_stage("Hermes") + + elif current_stage == "Hermes": + run(Hermes) + wait_for(impl_code.md) + mark_done("Hermes") + next_stage("Apollo") + + elif current_stage == "Apollo": + run(Apollo) + wait_for(refactor_report.md) + mark_done("Apollo") + mark(overall_status="โœ… completed") +``` + +## ๐Ÿงฉ 7. ๋ฌธ์„œ ๊ฐ„ ๊ด€๊ณ„ ๊ตฌ์กฐ (๋ฐ์ดํ„ฐ ํ”Œ๋กœ์šฐ) + +``` +์‚ฌ์šฉ์ž ์ž…๋ ฅ +โ†“ +feature_spec.md โ† Athena +โ†“ +test_spec.md โ† Artemis +โ†“ +test_code.md โ† Poseidon +โ†“ +impl_code.md โ† Hermes +โ†“ +refactor_report.md โ† Apollo +``` + +๋ชจ๋“  ๋ฌธ์„œ๋Š” `context.md`์— ๋งํฌ๋กœ ๊ธฐ๋ก๋˜์–ด ์žˆ์œผ๋ฉฐ, Zeus๋Š” ์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‹คํ–‰ ์ƒํƒœ๋ฅผ ํŒ๋ณ„ํ•œ๋‹ค. + +## โœ… 8. ์™„๋ฃŒ ์กฐ๊ฑด ์š”์•ฝ + +| ์กฐ๊ฑด | ์˜๋ฏธ | +| ---------------------------------------- | ----------------------------------------- | +| ๋ชจ๋“  Stage๊ฐ€ `โœ… done` | ๊ฐ ์—์ด์ „ํŠธ์˜ ์ถœ๋ ฅ ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๊ณ  ๊ฒ€์ฆ๋จ | +| ํ…Œ์ŠคํŠธ ํ†ต๊ณผ | Hermes โ†’ Apollo ๋‹จ๊ณ„์—์„œ ๋ณด์žฅ | +| Zeus์˜ `overall_status`๊ฐ€ `โœ… completed` | ์ „์ฒด ์‚ฌ์ดํด ์ข…๋ฃŒ | + +--- + +## ๐Ÿ“ 9. ๋ฌธ์„œ ๊ด€๋ฆฌ ๊ทœ์น™ + +``` +/agents/ # ์—์ด์ „ํŠธ ์นด๋“œ +โ”œโ”€โ”€ zeus.md +โ”œโ”€โ”€ athena.md +โ”œโ”€โ”€ artemis.md +โ”œโ”€โ”€ poseidon.md +โ”œโ”€โ”€ hermes.md +โ””โ”€โ”€ apollo.md + +/docs +โ”‚ +โ”œโ”€โ”€ checklists/ # ๊ฐ ์—์ด์ „ํŠธ ์ž‘์—… ํ›„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ +โ”‚ โ”œโ”€โ”€ zeus_checklist.md +โ”‚ โ”œโ”€โ”€ athena_checklist.md +โ”‚ โ”œโ”€โ”€ artemis_checklist.md +โ”‚ โ”œโ”€โ”€ poseidon_checklist.md +โ”‚ โ”œโ”€โ”€ hermes_checklist.md +โ”‚ โ””โ”€โ”€ apollo_checklist.md +โ”‚ +โ”œโ”€โ”€ guides/ # ๊ฐ ์—์ด์ „ํŠธ๋ณ„ ์ž‘์—… ๊ฐ€์ด๋“œ +โ”‚ โ”œโ”€โ”€ zeus_guide.md +โ”‚ โ”œโ”€โ”€ athena_guide.md +โ”‚ โ”œโ”€โ”€ artemis_guide.md +โ”‚ โ”œโ”€โ”€ poseidon_guide.md +โ”‚ โ”œโ”€โ”€ hermes_guide.md +โ”‚ โ””โ”€โ”€ apollo_guide.md +โ”‚ +โ”œโ”€โ”€ templates/ # ํ…œํ”Œ๋ฆฟ ๋ฌธ์„œ +โ”‚ โ”œโ”€โ”€ agent_card_template.md +โ”‚ โ”œโ”€โ”€ checklist_template.md +โ”‚ โ”œโ”€โ”€ guide_template.md +โ”‚ โ”œโ”€โ”€ context_template.md +โ”‚ โ”œโ”€โ”€ feature_spec_template.md +โ”‚ โ”œโ”€โ”€ test_spec_template.md +โ”‚ โ”œโ”€โ”€ test_code_template.md +โ”‚ โ”œโ”€โ”€ impl_code_template.md +โ”‚ โ””โ”€โ”€ refactor_report_template.md +โ”‚ +โ”œโ”€โ”€ system/ # (๊ณ ์ •) ์‹œ์Šคํ…œ ์ „๋ฐ˜ ๋ช…์„ธ ๋ฐ ๊ฐ€์ด๋“œ +โ”‚ โ””โ”€โ”€ agents_spec.md # ํ˜„์žฌ ๋ฌธ์„œ (์—์ด์ „ํŠธ ๋ช…์„ธ) +โ”‚ +โ””โ”€โ”€ sessions/ # (์„ธ์…˜ ๋‹จ์œ„ ์‹คํ–‰ ํด๋”) + โ”œโ”€โ”€ tdd_2025-10-30_001/ # ์„ธ์…˜๋ณ„ ID ํด๋” + โ”‚ โ”œโ”€โ”€ context.md + โ”‚ โ”œโ”€โ”€ feature_spec.md + โ”‚ โ”œโ”€โ”€ test_spec.md + โ”‚ โ”œโ”€โ”€ test_code.md + โ”‚ โ”œโ”€โ”€ impl_code.md + โ”‚ โ””โ”€โ”€ refactor_report.md + โ”‚ + โ””โ”€โ”€ tdd_2025-10-30_002/ + โ””โ”€โ”€ ... + +``` + +--- + +์ด ๋ฌธ์„œ(`agents_spec.md`)๋Š” Zeus๊ฐ€ ๊ฐ ์—์ด์ „ํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์ƒํƒœ๋ฅผ ํ•ด์„ํ•˜๋ฉฐ, ์ˆœ์„œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์„ค๊ณ„๋„ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. +์ฆ‰, ๊ฐ ์—์ด์ „ํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ ์ด ๋ช…์„ธ๋ฅผ ์ฐธ์กฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. diff --git a/docs/templates/agent_card_template.md b/docs/templates/agent_card_template.md new file mode 100644 index 00000000..3a846902 --- /dev/null +++ b/docs/templates/agent_card_template.md @@ -0,0 +1,114 @@ +# ๐Ÿ‘ค [์—์ด์ „ํŠธ๋ช…] ์—์ด์ „ํŠธ ์นด๋“œ + +> ์ด ๋ฌธ์„œ๋Š” "[์—์ด์ „ํŠธ๋ช…]" ์—์ด์ „ํŠธ์˜ ์ƒ์„ธ ์‚ฌ์–‘์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ๋‚ด์—์„œ์˜ ์—ญํ• , ์ฑ…์ž„, ์ž‘๋™ ๋ฐฉ์‹ ๋ฐ ๊ธฐํƒ€ ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 1. ๐ŸŒŸ ์—์ด์ „ํŠธ ๊ฐœ์š” + +- **์—์ด์ „ํŠธ๋ช…**: [์—์ด์ „ํŠธ์˜ ๊ณต์‹ ๋ช…์นญ] +- **ํŽ˜๋ฅด์†Œ๋‚˜**: [์—์ด์ „ํŠธ์˜ ํŠน์ง•์„ ๋‚˜ํƒ€๋‚ด๋Š” ํŽ˜๋ฅด์†Œ๋‚˜ ์„ค๋ช… (์˜ˆ: ์•„ํ…Œ๋„ค - ์ง€ํ˜œ์™€ ์ „๋žต์˜ ์—ฌ์‹ )] +- **ํ•ต์‹ฌ ์—ญํ•  ์š”์•ฝ**: [์—์ด์ „ํŠธ์˜ ์ฃผ์š” ์—ญํ• ์„ ํ•œ๋‘ ๋ฌธ์žฅ์œผ๋กœ ์š”์•ฝ] +- **์‹œ์Šคํ…œ ๋‚ด ์œ„์น˜**: [Zeus ์›Œํฌํ”Œ๋กœ์šฐ ๋‚ด์—์„œ ์ด ์—์ด์ „ํŠธ๊ฐ€ ์œ„์น˜ํ•˜๋Š” ๋‹จ๊ณ„ (์˜ˆ: Athena๋Š” 1๋‹จ๊ณ„ ๊ธฐ๋Šฅ ์„ค๊ณ„)] + +--- + +## 2. ๐Ÿš€ ์ƒ์„ธ ์—ญํ•  ๋ฐ ์ฑ…์ž„ + +[์—์ด์ „ํŠธ์˜ '์ฃผ์š” ์—ญํ• '์„ ์ƒ์„ธํ•˜๊ฒŒ ๊ธฐ์ˆ ํ•ฉ๋‹ˆ๋‹ค. `agents_spec.md`์˜ ๋‚ด์šฉ์„ ํ™•์žฅํ•˜์—ฌ ๊ตฌ์ฒด์ ์ธ ์ž‘์—… ๋‚ด์šฉ, ์˜์‚ฌ๊ฒฐ์ • ๊ธฐ์ค€, ๊ณ ๋ ค์‚ฌํ•ญ ๋“ฑ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.] + +- **์ฃผ์š” ์ž‘์—… 1**: [๊ตฌ์ฒด์ ์ธ ์ž‘์—… ๋‚ด์šฉ] + - ์„ธ๋ถ€ ์ฑ…์ž„ 1-1 + - ์„ธ๋ถ€ ์ฑ…์ž„ 1-2 +- **์ฃผ์š” ์ž‘์—… 2**: [๊ตฌ์ฒด์ ์ธ ์ž‘์—… ๋‚ด์šฉ] + - ์„ธ๋ถ€ ์ฑ…์ž„ 2-1 + - ์„ธ๋ถ€ ์ฑ…์ž„ 2-2 + +--- + +## 3. ๐Ÿ“ฅ ์ž…๋ ฅ ์‚ฌ์–‘ + +[์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ž…๋ ฅ ํŒŒ์ผ ๋ฐ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ƒ์„ธ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.] + +- **์ฃผ์š” ์ž…๋ ฅ ํŒŒ์ผ**: [์ž…๋ ฅ์œผ๋กœ ๋ฐ›๋Š” ์ฃผ์š” ํŒŒ์ผ๋ช… (์˜ˆ: `feature_spec.md`)] + - **ํŒŒ์ผ ๊ฒฝ๋กœ**: [์ž…๋ ฅ ํŒŒ์ผ์ด ์œ„์น˜ํ•  ์˜ˆ์ƒ ๊ฒฝ๋กœ (์˜ˆ: `docs/sessions/tdd_YYYY-MM-DD_NNN/`)] + - **๋‚ด์šฉ ๊ตฌ์กฐ**: [์ž…๋ ฅ ํŒŒ์ผ์˜ ์˜ˆ์ƒ๋˜๋Š” Markdown ๊ตฌ์กฐ (์˜ˆ: ํ—ค๋”, ์ฝ”๋“œ ๋ธ”๋ก, ๋ชฉ๋ก ๋“ฑ) ๋ฐ ํฌํ•จ๋˜์–ด์•ผ ํ•  ํ•ต์‹ฌ ์ •๋ณด] + - **๋ฐ์ดํ„ฐ ํ˜•์‹**: [์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์ฒด์ ์ธ ํ˜•์‹ (์˜ˆ: JSON, YAML, ํŠน์ • Markdown ํฌ๋งท)] +- **๋ณด์กฐ ์ž…๋ ฅ/์ฐธ์กฐ**: [์ฃผ์š” ์ž…๋ ฅ ์™ธ์— ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ ๋˜๋Š” ์ •๋ณด (์˜ˆ: `context.md`, ์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ)] + +--- + +## 4. ๐Ÿ“ค ์ถœ๋ ฅ ์‚ฌ์–‘ + +[์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์™„๋ฃŒํ•œ ํ›„ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ์ถœ๋ ฅ ํŒŒ์ผ ๋ฐ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ƒ์„ธ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.] + +- **์ฃผ์š” ์ถœ๋ ฅ ํŒŒ์ผ**: [์ƒ์„ฑํ•˜๋Š” ์ฃผ์š” ํŒŒ์ผ๋ช… (์˜ˆ: `test_spec.md`)] + - **ํŒŒ์ผ ๊ฒฝ๋กœ**: [์ถœ๋ ฅ ํŒŒ์ผ์ด ์ €์žฅ๋  ๊ฒฝ๋กœ (์˜ˆ: `docs/sessions/tdd_YYYY-MM-DD_NNN/`)] + - **๋‚ด์šฉ ๊ตฌ์กฐ**: [์ถœ๋ ฅ ํŒŒ์ผ์˜ ์˜ˆ์ƒ๋˜๋Š” Markdown ๊ตฌ์กฐ ๋ฐ ํฌํ•จ๋˜์–ด์•ผ ํ•  ํ•ต์‹ฌ ์ •๋ณด] + - **๋ฐ์ดํ„ฐ ํ˜•์‹**: [์ถœ๋ ฅ ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์ฒด์ ์ธ ํ˜•์‹] + - **Zeus์˜ ์ „ํ™˜ ์กฐ๊ฑด**: [์ด ์ถœ๋ ฅ ํŒŒ์ผ์ด Zeus์˜ ๋‹ค์Œ ๋‹จ๊ณ„ ์ „ํ™˜ ์กฐ๊ฑด์— ์–ด๋–ป๊ฒŒ ๊ธฐ์—ฌํ•˜๋Š”์ง€ ์„ค๋ช…] +- **์ƒ์„ฑ ๊ทœ์น™**: [์ถœ๋ ฅ ํŒŒ์ผ ์ƒ์„ฑ ์‹œ ํŠน๋ณ„ํžˆ ๊ณ ๋ คํ•ด์•ผ ํ•  ๊ทœ์น™ (์˜ˆ: ๋นˆ ์ฝ”๋“œ ๋ธ”๋ก ํฌํ•จ, ํŠน์ • ํƒœ๊ทธ ์‚ฌ์šฉ)] + +--- + +## 5. ๐Ÿ› ๏ธ ์‚ฌ์šฉ ๋„๊ตฌ ๋ฐ ๊ธฐ์ˆ  ์Šคํƒ + +[์—์ด์ „ํŠธ๊ฐ€ ์ž์‹ ์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํŠน์ • ๋„๊ตฌ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ๊ธฐ์ˆ  ์Šคํƒ์— ๋Œ€ํ•œ ์ •๋ณด์ž…๋‹ˆ๋‹ค.] + +- **์ฃผ์š” ๋„๊ตฌ**: [์˜ˆ: Vitest, React Testing Library, ESLint, Prettier] +- **ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด**: [์˜ˆ: TypeScript, JavaScript] +- **ํ”„๋ ˆ์ž„์›Œํฌ/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ**: [์˜ˆ: React] +- **๊ธฐํƒ€**: [ํŠน์ • API, ์™ธ๋ถ€ ์„œ๋น„์Šค ๋“ฑ] + +--- + +## 6. ๐Ÿ’ก ์˜์‚ฌ๊ฒฐ์ • ๋กœ์ง ๋ฐ ์ „๋žต + +[์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ ์–ด๋–ค ์˜์‚ฌ๊ฒฐ์ • ๋กœ์ง์ด๋‚˜ ์ „๋žต์„ ๋”ฐ๋ฅด๋Š”์ง€ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” '์–ด๋–ป๊ฒŒ' ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊นŠ์ด ์žˆ๋Š” ์ดํ•ด๋ฅผ ๋•์Šต๋‹ˆ๋‹ค.] + +- **[์ฃผ์š” ์˜์‚ฌ๊ฒฐ์ • ์ƒํ™ฉ 1]**: [์ƒํ™ฉ ์„ค๋ช…] + - **์ „๋žต/๋กœ์ง**: [ํ•ด๋‹น ์ƒํ™ฉ์—์„œ ์—์ด์ „ํŠธ๊ฐ€ ๋”ฐ๋ฅด๋Š” ์ „๋žต ๋˜๋Š” ๋กœ์ง] + - **๊ณ ๋ ค์‚ฌํ•ญ**: [์˜์‚ฌ๊ฒฐ์ • ์‹œ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๋Š” ์š”์†Œ] +- **[์ฃผ์š” ์˜์‚ฌ๊ฒฐ์ • ์ƒํ™ฉ 2]**: [์ƒํ™ฉ ์„ค๋ช…] + - **์ „๋žต/๋กœ์ง**: [ํ•ด๋‹น ์ƒํ™ฉ์—์„œ ์—์ด์ „ํŠธ๊ฐ€ ๋”ฐ๋ฅด๋Š” ์ „๋žต ๋˜๋Š” ๋กœ์ง] + - **๊ณ ๋ ค์‚ฌํ•ญ**: [์˜์‚ฌ๊ฒฐ์ • ์‹œ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๋Š” ์š”์†Œ] + +--- + +## 7. โš ๏ธ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐ ์‹คํŒจ ์‹œ ๋™์ž‘ + +[์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ƒํ™ฉ์ด๋‚˜ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ์—์ด์ „ํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ฐ€์ด๋“œ๋ผ์ธ์ž…๋‹ˆ๋‹ค.] + +- **[์˜ˆ์™ธ ์ƒํ™ฉ 1]**: [์˜ˆ์™ธ ์ƒํ™ฉ ์„ค๋ช… (์˜ˆ: ์ž…๋ ฅ ํŒŒ์ผ ํŒŒ์‹ฑ ์‹คํŒจ)] + - **๋™์ž‘**: [์—์ด์ „ํŠธ์˜ ๋Œ€์‘ ๋ฐฉ์‹ (์˜ˆ: ์ž‘์—… ์ค‘๋‹จ, ๋กœ๊ทธ ๊ธฐ๋ก, Zeus์—๊ฒŒ ๋ณด๊ณ )] +- **[์˜ˆ์™ธ ์ƒํ™ฉ 2]**: [์˜ˆ์™ธ ์ƒํ™ฉ ์„ค๋ช… (์˜ˆ: ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ ์‹คํŒจ)] + - **๋™์ž‘**: [์—์ด์ „ํŠธ์˜ ๋Œ€์‘ ๋ฐฉ์‹] + +--- + +## 8. ๐Ÿ”„ Zeus์™€์˜ ์ƒํ˜ธ์ž‘์šฉ + +[Zeus(์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ)์™€์˜ ์ƒํ˜ธ์ž‘์šฉ ๋ฐฉ์‹์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.] + +- **์ž‘์—… ์‹œ์ž‘ ์กฐ๊ฑด**: [Zeus๊ฐ€ ์ด ์—์ด์ „ํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์กฐ๊ฑด] +- **์ž‘์—… ์™„๋ฃŒ ๋ณด๊ณ **: [์ด ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—… ์™„๋ฃŒ๋ฅผ Zeus์—๊ฒŒ ์•Œ๋ฆฌ๋Š” ๋ฐฉ์‹ (์˜ˆ: ํŠน์ • ํŒŒ์ผ ์ƒ์„ฑ)] +- **์ƒํƒœ ์—…๋ฐ์ดํŠธ**: [Zeus๊ฐ€ `context.md`๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์ด ์—์ด์ „ํŠธ๊ฐ€ ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๋Š”์ง€] + +--- + +## 9. ๐Ÿ“š ๊ด€๋ จ ๋ฌธ์„œ ๋ฐ ์ฐธ์กฐ + +[์ด ์—์ด์ „ํŠธ์™€ ๊ด€๋ จ๋œ ๋‹ค๋ฅธ ๋ฌธ์„œ๋‚˜ ์™ธ๋ถ€ ์ž๋ฃŒ์— ๋Œ€ํ•œ ๋งํฌ ๋ฐ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.] + +- **`agents_spec.md`**: ์‹œ์Šคํ…œ ์ „์ฒด ๋ช…์„ธ +- **`{{agent_name}}_checklist.md`**: [์—์ด์ „ํŠธ๋ช…] ์—์ด์ „ํŠธ ์ž‘์—… ์ฒดํฌ๋ฆฌ์ŠคํŠธ +- **`{{agent_name}}_guide.md`**: [์—์ด์ „ํŠธ๋ช…] ์—์ด์ „ํŠธ ์ž‘์—… ๊ฐ€์ด๋“œ๋ผ์ธ +- [๊ธฐํƒ€ ๊ด€๋ จ ๋ฌธ์„œ ๋งํฌ ๋ฐ ์„ค๋ช…] + +--- + +## ๐Ÿ“ ๋ณ€๊ฒฝ ์ด๋ ฅ + +| ๋ฒ„์ „ | ๋‚ ์งœ | ๋ณ€๊ฒฝ ๋‚ด์šฉ | ์ž‘์„ฑ์ž | +| :--- | :--------- | :-------- | :------- | +| 1.0 | YYYY-MM-DD | ์ตœ์ดˆ ์ž‘์„ฑ | [์ž‘์„ฑ์ž] | diff --git a/docs/templates/checklist_template.md b/docs/templates/checklist_template.md new file mode 100644 index 00000000..949d4d89 --- /dev/null +++ b/docs/templates/checklist_template.md @@ -0,0 +1,37 @@ +# ๐Ÿ“ Agent Checklist + +์ด ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋Š” ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์™„๋ฃŒํ•œ ํ›„, ์ž์‹ ์˜ ์‚ฐ์ถœ๋ฌผ์ด ๋ช…์„ธ์— ๋ถ€ํ•ฉํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์—์ด์ „ํŠธ๋Š” ์•„๋ž˜ ๊ณตํ†ต ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## โœ… ๊ณตํ†ต ์ฒดํฌ๋ฆฌ์ŠคํŠธ + +### 1. ์ž…๋ ฅ ๋ฐ ์ปจํ…์ŠคํŠธ (Input & Context) + +- **์ž…๋ ฅ ํŒŒ์ผ ํ™•์ธ**: ์ด์ „ ๋‹จ๊ณ„์˜ ์‚ฐ์ถœ๋ฌผ(`*.md`)์„ ์ •ํ™•ํžˆ ์ž…๋ ฅ ๋ฐ›์•˜๋Š”๊ฐ€? +- **์ž…๋ ฅ ๋‚ด์šฉ ๊ฒ€์ฆ**: ์ž…๋ ฅ ํŒŒ์ผ์˜ ๋‚ด์šฉ์ด ๋น„์–ด์žˆ์ง€ ์•Š๊ณ , ์˜ˆ์ƒ๋œ ๊ตฌ์กฐ(ํ—ค๋”, ์ฝ”๋“œ ๋ธ”๋ก ๋“ฑ)๋ฅผ ํฌํ•จํ•˜๋Š”๊ฐ€? +- **`agents_spec.md` ์ฐธ์กฐ**: ์ž‘์—… ์ˆ˜ํ–‰์— ํ•„์š”ํ•œ ๋ชจ๋“  ๊ทœ์น™๊ณผ ๋ช…์„ธ๋ฅผ `agents_spec.md`์—์„œ ๋‹ค์‹œ ํ™•์ธํ–ˆ๋Š”๊ฐ€? + +### 2. ์—ญํ•  ์ˆ˜ํ–‰ ๋ฐ ์‚ฐ์ถœ๋ฌผ ์ƒ์„ฑ (Role & Output) + +- **ํŽ˜๋ฅด์†Œ๋‚˜ ์œ ์ง€**: ์ž์‹ ์˜ ํŽ˜๋ฅด์†Œ๋‚˜(์˜ˆ: Athena์˜ ์ง€ํ˜œ, Poseidon์˜ ์ •ํ™•์„ฑ)์— ๋งž๋Š” ๊ฒฐ๊ณผ๋ฌผ์„ ์ƒ์„ฑํ–ˆ๋Š”๊ฐ€? +- **ํ•ต์‹ฌ ์—ญํ•  ์™„์ˆ˜**: `agents_spec.md`์— ์ •์˜๋œ ์ž์‹ ์˜ ํ•ต์‹ฌ ์—ญํ• ์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ–ˆ๋Š”๊ฐ€? +- **์‚ฐ์ถœ๋ฌผ ๊ฒฝ๋กœ ๋ฐ ์ด๋ฆ„**: ์‚ฐ์ถœ๋ฌผ(`*.md`)์„ ์ •ํ™•ํ•œ ๊ฒฝ๋กœ(`docs/sessions/tdd_YYYY-MM-DD_NNN/`)์— ์˜ฌ๋ฐ”๋ฅธ ์ด๋ฆ„์œผ๋กœ ์ƒ์„ฑํ–ˆ๋Š”๊ฐ€? +- **์‚ฐ์ถœ๋ฌผ ํ˜•์‹ ์ค€์ˆ˜**: ์‚ฐ์ถœ๋ฌผ ๋‚ด์šฉ์ด `agents_spec.md`์™€ ํ…œํ”Œ๋ฆฟ(`docs/templates/`)์— ๋ช…์‹œ๋œ ํ˜•์‹๊ณผ ๊ตฌ์กฐ๋ฅผ ์™„๋ฒฝํžˆ ๋”ฐ๋ฅด๋Š”๊ฐ€? +- **๋ถˆํ•„์š”ํ•œ ๋‚ด์šฉ ์ œ๊ฑฐ**: ์ตœ์ข… ์‚ฐ์ถœ๋ฌผ์— ๋””๋ฒ„๊น… ๋กœ๊ทธ, ์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ์ฝ”๋“œ, ์ž„์‹œ ๋ฉ”๋ชจ ๋“ฑ ๋ถˆํ•„์š”ํ•œ ๋‚ด์šฉ์ด ์—†๋Š”๊ฐ€? + +### 3. ํ’ˆ์งˆ ๋ฐ ๊ฒ€์ฆ (Quality & Verification) + +- **์ž๊ธฐ ํ‰๊ฐ€**: ์ƒ์„ฑ๋œ ์‚ฐ์ถœ๋ฌผ์ด ๋‹ค์Œ ๋‹จ๊ณ„ ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์ •๋ณด๋ฅผ ๋ช…ํ™•ํ•˜๊ณ  ์™„์ „ํ•˜๊ฒŒ ๋‹ด๊ณ  ์žˆ๋Š”๊ฐ€? +- **์ฝ”๋“œ ์ปจ๋ฒค์…˜ ์ค€์ˆ˜ (์ฝ”๋“œ ์ƒ์„ฑ ์‹œ)**: ์ฝ”๋“œ ์ƒ์„ฑ/์ˆ˜์ •์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ, ํ”„๋กœ์ ํŠธ์˜ ESLint ๋ฐ Prettier ๊ทœ์น™์„ ์ค€์ˆ˜ํ–ˆ๋Š”๊ฐ€? +- **๋ณด์•ˆ ๊ฒ€์ฆ**: ์‚ฐ์ถœ๋ฌผ์— API ํ‚ค, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์•˜๋Š”๊ฐ€? +- **๋งํฌ ์œ ํšจ์„ฑ**: ์‚ฐ์ถœ๋ฌผ ๋‚ด๋ถ€์— ํฌํ•จ๋œ ํŒŒ์ผ ๊ฒฝ๋กœ ๋“ฑ์˜ ๋งํฌ๊ฐ€ ๋ชจ๋‘ ์œ ํšจํ•œ๊ฐ€? + +--- + +## ๐ŸŽฏ ๊ฐœ๋ณ„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ + +_์ด ์„น์…˜์€ ๊ฐ ์—์ด์ „ํŠธ์˜ ํŠน์ • ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž์ถฐ ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค._ + +- ... +- ... diff --git a/docs/templates/context_template.md b/docs/templates/context_template.md new file mode 100644 index 00000000..7f3e8700 --- /dev/null +++ b/docs/templates/context_template.md @@ -0,0 +1,53 @@ +# ๐Ÿ“ TDD ํŒŒ์ดํ”„๋ผ์ธ ์ปจํ…์ŠคํŠธ (context.md) + +> ์ด ๋ฌธ์„œ๋Š” Zeus ์—์ด์ „ํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ TDD ๊ฐœ๋ฐœ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ „์ฒด ์ง„ํ–‰ ์ƒํƒœ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋ฉ”์ธ ์ƒํƒœ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ๋‹จ๊ณ„, ๊ฐ ์—์ด์ „ํŠธ์˜ ์™„๋ฃŒ ์—ฌ๋ถ€, ๊ทธ๋ฆฌ๊ณ  ์ƒ์„ฑ๋œ ์ฃผ์š” ์‚ฐ์ถœ๋ฌผ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 1. ๐ŸŒŸ ์ „์ฒด ์ง„ํ–‰ ์ƒํƒœ + +- **`overall_status`**: [์ง„ํ–‰ ์ƒํƒœ: `โœ… completed`, `๐Ÿ”„ in_progress`, `โŒ failed`] +- **`current_stage`**: [ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ๋‹จ๊ณ„: `Athena`, `Artemis`, `Poseidon`, `Hermes`, `Apollo`, `completed`] +- **`last_updated`**: [YYYY-MM-DD HH:MM:SS] + +--- + +## 2. ๐Ÿš€ ์—์ด์ „ํŠธ๋ณ„ ์™„๋ฃŒ ์ƒํƒœ + +| ์—์ด์ „ํŠธ๋ช… | ์ƒํƒœ | ์™„๋ฃŒ ์‹œ๊ฐ„ (YYYY-MM-DD HH:MM:SS) | +| :----------- | :----------------------------------- | :------------------------------ | +| **Athena** | [โœ… done, ๐Ÿ”„ in_progress, โŒ failed] | [YYYY-MM-DD HH:MM:SS] | +| **Artemis** | [โœ… done, ๐Ÿ”„ in_progress, โŒ failed] | [YYYY-MM-DD HH:MM:SS] | +| **Poseidon** | [โœ… done, ๐Ÿ”„ in_progress, โŒ failed] | [YYYY-MM-DD HH:MM:SS] | +| **Hermes** | [โœ… done, ๐Ÿ”„ in_progress, โŒ failed] | [YYYY-MM-DD HH:MM:SS] | +| **Apollo** | [โœ… done, ๐Ÿ”„ in_progress, โŒ failed] | [YYYY-MM-DD HH:MM:SS] | + + +--- + +## 3. ๐Ÿ“ ์ฃผ์š” ์‚ฐ์ถœ๋ฌผ ํŒŒ์ผ ๊ฒฝ๋กœ + +๊ฐ ์—์ด์ „ํŠธ๊ฐ€ ์ƒ์„ฑํ•œ ์ฃผ์š” ์‚ฐ์ถœ๋ฌผ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. + +- **`feature_spec.md`**: [docs/sessions/tdd_YYYY-MM-DD_NNN/feature_spec.md ๋˜๋Š” `(์ƒ์„ฑ ์ „)`] +- **`test_spec.md`**: [docs/sessions/tdd_YYYY-MM-DD_NNN/test_spec.md ๋˜๋Š” `(์ƒ์„ฑ ์ „)`] +- **`test_code.md`**: [docs/sessions/tdd_YYYY-MM-DD_NNN/test_code.md ๋˜๋Š” `(์ƒ์„ฑ ์ „)`] +- **`impl_code.md`**: [docs/sessions/tdd_YYYY-MM-DD_NNN/impl_code.md ๋˜๋Š” `(์ƒ์„ฑ ์ „)`] +- **`refactor_report.md`**: [docs/sessions/tdd_YYYY-MM-DD_NNN/refactor_report.md ๋˜๋Š” `(์ƒ์„ฑ ์ „)`] + +--- + +## 4. ๐Ÿ“š ๊ด€๋ จ ๋ฌธ์„œ ๋ฐ ์ฐธ์กฐ + +- **`agents_spec.md`**: ์‹œ์Šคํ…œ ์ „์ฒด ๋ช…์„ธ +- **`zeus_card.md`**: Zeus ์—์ด์ „ํŠธ ์นด๋“œ +- **`zeus_guide.md`**: Zeus ์—์ด์ „ํŠธ ์ž‘์—… ๊ฐ€์ด๋“œ๋ผ์ธ +- **`zeus_checklist.md`**: Zeus ์—์ด์ „ํŠธ ์ž‘์—… ์ฒดํฌ๋ฆฌ์ŠคํŠธ + +--- + +## ๐Ÿ“ ๋ณ€๊ฒฝ ์ด๋ ฅ + +| ๋ฒ„์ „ | ๋‚ ์งœ | ๋ณ€๊ฒฝ ๋‚ด์šฉ | ์ž‘์„ฑ์ž | +| :--- | :--------- | :-------- | :----- | +| 1.0 | 2025-10-30 | ์ตœ์ดˆ ์ž‘์„ฑ | Gemini | diff --git a/docs/templates/feature_spec_template.md b/docs/templates/feature_spec_template.md new file mode 100644 index 00000000..ec44c1b9 --- /dev/null +++ b/docs/templates/feature_spec_template.md @@ -0,0 +1,139 @@ +# ๐Ÿ“„ ๊ธฐ๋Šฅ ๋ช…์„ธ์„œ (Feature Specification Document) + +> ์ด ๋ฌธ์„œ๋Š” ์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ถ„์„ํ•˜์—ฌ PRD(Product Requirements Document) ์ˆ˜์ค€์˜ ์ƒ์„ธ ๊ธฐ๋Šฅ ๋ช…์„ธ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. Artemis ์—์ด์ „ํŠธ๊ฐ€ ์ด ๋ฌธ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค ๋ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ช…ํ™•ํ•˜๊ณ  ๊ตฌ์ฒด์ ์œผ๋กœ ์ž‘์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 1. ๐ŸŒŸ ๊ธฐ๋Šฅ ๊ฐœ์š” (Feature Overview) + +### 1.1 ๊ธฐ๋Šฅ๋ช… + +[๊ธฐ๋Šฅ์˜ ๋ช…์นญ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ] + +### 1.2 ๊ธฐ๋Šฅ ๋ชฉ์  + +[์ด ๊ธฐ๋Šฅ์ด ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ œ ๋˜๋Š” ๋‹ฌ์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ๋ชฉํ‘œ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.] + +### 1.3 ๊ธฐ๋Šฅ ๋ฒ”์œ„ + +[์ด ๊ธฐ๋Šฅ์ด ํฌํ•จํ•˜๋Š” ๋ฒ”์œ„์™€ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๋ฒ”์œ„๋ฅผ ๋ช…ํ™•ํžˆ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.] + +### 1.4 ์ฃผ์š” ์‚ฌ์šฉ์ž ์‹œ๋‚˜๋ฆฌ์˜ค + +[์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ์š” ์‚ฌ์šฉ์ž ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. (์„ ํƒ ์‚ฌํ•ญ)] + +--- + +## 2. ๐Ÿš€ ์ƒ์„ธ ๊ธฐ๋Šฅ ๋ช…์„ธ (Detailed Feature Specification) + +[๊ฐ ๊ธฐ๋Šฅ ๋‹จ์œ„๋ณ„๋กœ ์ƒ์„ธํ•œ ๋™์ž‘ ๋ฐฉ์‹, ๋กœ์ง, UI/UX ๊ณ ๋ ค์‚ฌํ•ญ(ํ•„์š”์‹œ) ๋“ฑ์„ ๊ธฐ์ˆ ํ•ฉ๋‹ˆ๋‹ค. TDD ์›์น™์— ๋”ฐ๋ผ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž‘์„ฑ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.] + +### 2.1 [ํ•˜์œ„ ๊ธฐ๋Šฅ๋ช… 1] + +[ํ•˜์œ„ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ƒ์„ธ ์„ค๋ช…] + +#### 2.1.1 ๋™์ž‘ ํ๋ฆ„ + +[ํ•˜์œ„ ๊ธฐ๋Šฅ์˜ ์ผ๋ฐ˜์ ์ธ ๋™์ž‘ ํ๋ฆ„์„ ๋‹จ๊ณ„๋ณ„๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.] + +#### 2.1.2 ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง + +[ํ•˜์œ„ ๊ธฐ๋Šฅ๊ณผ ๊ด€๋ จ๋œ ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.] + +#### 2.1.3 UI/UX ๊ณ ๋ ค์‚ฌํ•ญ (์„ ํƒ ์‚ฌํ•ญ) + +[์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ๊ฒฝํ—˜๊ณผ ๊ด€๋ จ๋œ ํŠน๋ณ„ํ•œ ๊ณ ๋ ค์‚ฌํ•ญ์ด ์žˆ๋‹ค๋ฉด ๊ธฐ์ˆ ํ•ฉ๋‹ˆ๋‹ค.] + +### 2.2 [ํ•˜์œ„ ๊ธฐ๋Šฅ๋ช… 2] + +[ํ•˜์œ„ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ƒ์„ธ ์„ค๋ช…] +... + +--- + +## 3. ๐Ÿ“ฅ ์ž…๋ ฅ/์ถœ๋ ฅ ์ •์˜ (Input/Output Definition) + +[๊ฐ ๊ธฐ๋Šฅ ๋˜๋Š” ํ•˜์œ„ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ž…๋ ฅ ํŒŒ๋ผ๋ฏธํ„ฐ, ์ถœ๋ ฅ ๊ฒฐ๊ณผ, ๋ฐ์ดํ„ฐ ํƒ€์ž…, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๊ทœ์น™ ๋“ฑ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์ธ ์ž…๋ ฅ๊ฐ’๊ณผ ์˜ˆ์‹œ ๊ฒฐ๊ณผ๊ฐ’์„ ํ•จ๊ป˜ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.] + +### 3.1 [๊ธฐ๋Šฅ๋ช… ๋˜๋Š” ํ•˜์œ„ ๊ธฐ๋Šฅ๋ช…] + +#### 3.1.1 ์ž…๋ ฅ (Input) + +| ํ•„๋“œ๋ช… | ํƒ€์ž… | ํ•„์ˆ˜ ์—ฌ๋ถ€ | ์„ค๋ช… | ์˜ˆ์‹œ ๊ฐ’ | +| :--------- | :------- | :-------- | :--------------------------------------- | :-------------- | +| `[ํ•„๋“œ๋ช…]` | `string` | `Y` | `[ํ•„๋“œ์— ๋Œ€ํ•œ ์ƒ์„ธ ์„ค๋ช…]` | `[์˜ˆ์‹œ ๋ฐ์ดํ„ฐ]` | +| `username` | `string` | `Y` | ์‚ฌ์šฉ์ž ๊ณ„์ •๋ช… (5~20์ž ์˜๋ฌธ/์ˆซ์ž) | `user123` | +| `password` | `string` | `Y` | ์‚ฌ์šฉ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ (8์ž ์ด์ƒ ํŠน์ˆ˜๋ฌธ์ž ํฌํ•จ) | `P@ssw0rd!` | + +#### 3.1.2 ์ถœ๋ ฅ (Output) + +| ํ•„๋“œ๋ช… | ํƒ€์ž… | ์„ค๋ช… | ์˜ˆ์‹œ ๊ฐ’ | +| :--------- | :------- | :------------------------ | :-------------- | +| `[ํ•„๋“œ๋ช…]` | `string` | `[ํ•„๋“œ์— ๋Œ€ํ•œ ์ƒ์„ธ ์„ค๋ช…]` | `[์˜ˆ์‹œ ๋ฐ์ดํ„ฐ]` | +| `token` | `string` | ์ธ์ฆ ํ† ํฐ | `eyJ...` | +| `userId` | `number` | ์‚ฌ์šฉ์ž ๊ณ ์œ  ID | `12345` | +| `message` | `string` | ์„ฑ๊ณต ๋ฉ”์‹œ์ง€ | `๋กœ๊ทธ์ธ ์„ฑ๊ณต` | + +--- + +## 4. โš ๏ธ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ (Error Handling) + +[๊ฐ ๊ธฐ๋Šฅ์—์„œ ๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ ์˜ˆ์™ธ ์ƒํ™ฉ, ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€, ์‹œ์Šคํ…œ์˜ ์˜ˆ์ƒ ๋™์ž‘ ๋ฐ ๋ณต๊ตฌ ์ „๋žต์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž‘์„ฑ์„ ์œ„ํ•ด ๊ตฌ์ฒด์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.] + +### 4.1 [์˜ˆ์™ธ ์ƒํ™ฉ๋ช… 1] + +[์˜ˆ์™ธ ์ƒํ™ฉ์— ๋Œ€ํ•œ ์„ค๋ช…] + +- **๋ฐœ์ƒ ์กฐ๊ฑด**: [์˜ˆ์™ธ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์กฐ๊ฑด] +- **์˜ค๋ฅ˜ ์ฝ”๋“œ/๋ฉ”์‹œ์ง€**: [ํด๋ผ์ด์–ธํŠธ ๋˜๋Š” ์‹œ์Šคํ…œ์— ๋ฐ˜ํ™˜๋  ์˜ค๋ฅ˜ ์ฝ”๋“œ ๋ฐ ๋ฉ”์‹œ์ง€] +- **์‹œ์Šคํ…œ ๋™์ž‘**: [์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ ์‹œ์Šคํ…œ์˜ ์˜ˆ์ƒ ๋™์ž‘ (์˜ˆ: ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ, ๋กœ๊ทธ ๊ธฐ๋ก, ์‚ฌ์šฉ์ž์—๊ฒŒ ์˜ค๋ฅ˜ ์•Œ๋ฆผ)] +- **๋ณต๊ตฌ ์ „๋žต**: [์˜ˆ์™ธ ๋ฐœ์ƒ ํ›„ ์‹œ์Šคํ…œ ๋˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ๋ณต๊ตฌ ์ „๋žต] + +### 4.2 [์˜ˆ์™ธ ์ƒํ™ฉ๋ช… 2] + +[์˜ˆ์™ธ ์ƒํ™ฉ์— ๋Œ€ํ•œ ์„ค๋ช…] +... + +--- + +## 5. ๐Ÿ“Š ์˜ํ–ฅ ๋ถ„์„ (Impact Analysis) + +[์ด ๊ธฐ๋Šฅ์ด ๊ธฐ์กด ์‹œ์Šคํ…œ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ, ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ๋ชจ๋“ˆ, ์ƒˆ๋กœ์šด ์˜์กด์„ฑ, ์„ฑ๋Šฅ/๋ณด์•ˆ/ํ™•์žฅ์„ฑ ๋“ฑ์— ๋Œ€ํ•œ ๊ณ ๋ ค์‚ฌํ•ญ์„ ๊ธฐ์ˆ ํ•ฉ๋‹ˆ๋‹ค. Artemis๊ฐ€ ํ…Œ์ŠคํŠธ ๋ฒ”์œ„๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•œ ์ •๋ณด์ž…๋‹ˆ๋‹ค.] + +### 5.1 ๊ธฐ์กด ์‹œ์Šคํ…œ ์˜ํ–ฅ + +[์ด ๊ธฐ๋Šฅ์˜ ์ถ”๊ฐ€ ๋˜๋Š” ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๊ธฐ์กด ๋ชจ๋“ˆ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ, API ๋“ฑ์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.] + +### 5.2 ์ƒˆ๋กœ์šด ์˜์กด์„ฑ (์ตœ์†Œํ™” ๋ฐฉ์•ˆ) + +[์ด ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ์œ„ํ•ด ์ถ”๊ฐ€๋˜๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์„œ๋น„์Šค, ๋‚ด๋ถ€ ๋ชจ๋“ˆ ๋“ฑ์˜ ์˜์กด์„ฑ์„ ๊ธฐ์ˆ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ, ๊ธฐ์กด ์‹œ์Šคํ…œ์˜ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๊ณ  ์ƒˆ๋กœ์šด ์˜์กด์„ฑ ์ถ”๊ฐ€๋Š” ์ตœ์†Œํ™”ํ•˜๋Š” ๋ฐฉ์•ˆ์„ ํ•จ๊ป˜ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.] + +### 5.3 ์„ฑ๋Šฅ/๋ณด์•ˆ/ํ™•์žฅ์„ฑ ๊ณ ๋ ค์‚ฌํ•ญ + +[์ด ๊ธฐ๋Šฅ๊ณผ ๊ด€๋ จ๋œ ์„ฑ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ, ๋ณด์•ˆ ์ทจ์•ฝ์  ๊ฐ€๋Šฅ์„ฑ, ํ–ฅํ›„ ํ™•์žฅ์„ฑ ๋“ฑ์— ๋Œ€ํ•œ ํŠน๋ณ„ํ•œ ๊ณ ๋ ค์‚ฌํ•ญ์„ ๊ธฐ์ˆ ํ•ฉ๋‹ˆ๋‹ค.] + +--- + +## 6. ๐Ÿงช ํ…Œ์ŠคํŠธ ๊ณ ๋ ค์‚ฌํ•ญ (Test Considerations) + +[Artemis ์—์ด์ „ํŠธ๊ฐ€ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค ๋ฐ ์ผ€์ด์Šค๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ํŠน๋ณ„ํžˆ ๊ณ ๋ คํ•ด์•ผ ํ•  ์‚ฌํ•ญ๋“ค์„ ๊ธฐ์ˆ ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์š” ์‹œ๋‚˜๋ฆฌ์˜ค, ์—ฃ์ง€ ์ผ€์ด์Šค, ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ์š”๊ตฌ์‚ฌํ•ญ ๋“ฑ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.] + +- **์ฃผ์š” ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค**: [์ด ๊ธฐ๋Šฅ์˜ ํ•ต์‹ฌ ๋™์ž‘์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•œ ์ฃผ์š” ์‹œ๋‚˜๋ฆฌ์˜ค ๋ชฉ๋ก] +- **์—ฃ์ง€ ์ผ€์ด์Šค**: [์ผ๋ฐ˜์ ์ด์ง€ ์•Š์ง€๋งŒ ๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ ์˜ˆ์™ธ์ ์ธ ์ž…๋ ฅ ๋˜๋Š” ์ƒํ™ฉ (์˜ˆ: ๋นˆ ๊ฐ’, ์ตœ๋Œ€ ๊ธธ์ด ์ดˆ๊ณผ, ๋™์‹œ์„ฑ ๋ฌธ์ œ)] +- **์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ์š”๊ตฌ์‚ฌํ•ญ (์„ ํƒ ์‚ฌํ•ญ)**: [ํŠน์ • ์„ฑ๋Šฅ ์ง€ํ‘œ(์‘๋‹ต ์‹œ๊ฐ„, ์ฒ˜๋ฆฌ๋Ÿ‰ ๋“ฑ)์— ๋Œ€ํ•œ ์š”๊ตฌ์‚ฌํ•ญ์ด ์žˆ๋‹ค๋ฉด ๊ธฐ์ˆ ํ•ฉ๋‹ˆ๋‹ค.] +- **๋ณด์•ˆ ํ…Œ์ŠคํŠธ ์š”๊ตฌ์‚ฌํ•ญ (์„ ํƒ ์‚ฌํ•ญ)**: [๋ณด์•ˆ ๊ด€๋ จ ํ…Œ์ŠคํŠธ(์ธ์ฆ, ๊ถŒํ•œ, ๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™” ๋“ฑ)์— ๋Œ€ํ•œ ์š”๊ตฌ์‚ฌํ•ญ์ด ์žˆ๋‹ค๋ฉด ๊ธฐ์ˆ ํ•ฉ๋‹ˆ๋‹ค.] + +--- + +## 7. ๐Ÿ“š ๊ด€๋ จ ๋ฌธ์„œ ๋ฐ ์ฐธ์กฐ + +- **`agents_spec.md`**: ์‹œ์Šคํ…œ ์ „์ฒด ๋ช…์„ธ +- [๊ธฐํƒ€ ๊ด€๋ จ ๋ฌธ์„œ ๋งํฌ ๋ฐ ์„ค๋ช…] + +--- + +## ๐Ÿ“ ๋ณ€๊ฒฝ ์ด๋ ฅ + +| ๋ฒ„์ „ | ๋‚ ์งœ | ๋ณ€๊ฒฝ ๋‚ด์šฉ | ์ž‘์„ฑ์ž | +| :--- | :--------- | :-------- | :------- | +| 1.0 | YYYY-MM-DD | ์ตœ์ดˆ ์ž‘์„ฑ | [์ž‘์„ฑ์ž] | diff --git a/docs/templates/guide_template.md b/docs/templates/guide_template.md new file mode 100644 index 00000000..60fca16a --- /dev/null +++ b/docs/templates/guide_template.md @@ -0,0 +1,50 @@ +# ๐Ÿ“š Agent ์ž‘์—… ๊ฐ€์ด๋“œ๋ผ์ธ ํ…œํ”Œ๋ฆฟ + +์ด ๋ฌธ์„œ๋Š” ๋ชจ๋“  ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๊ณตํ†ต์ ์œผ๋กœ ์ค€์ˆ˜ํ•ด์•ผ ํ•  ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์—์ด์ „ํŠธ๋Š” ์ด ํ…œํ”Œ๋ฆฟ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž์‹ ์˜ ๊ฐœ๋ณ„ ๊ฐ€์ด๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 1. ๐ŸŽฏ ์ž‘์—…์˜ ๋ชฉ์  ๋ฐ ์—ญํ•  ์ดํ•ด + +- **`agents_spec.md` ์ˆ™์ง€**: ์ž์‹ ์˜ ์—์ด์ „ํŠธ๊ฐ€ ์‹œ์Šคํ…œ ๋‚ด์—์„œ ์–ด๋–ค ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋ฉฐ, ์–ด๋–ค ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ ๊ฐ€์ง€๋Š”์ง€ `agents_spec.md` ๋ฌธ์„œ๋ฅผ ํ†ตํ•ด ๋ช…ํ™•ํžˆ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **ํŽ˜๋ฅด์†Œ๋‚˜ ์ค€์ˆ˜**: ๋ถ€์—ฌ๋œ ํŽ˜๋ฅด์†Œ๋‚˜(์˜ˆ: Athena์˜ ์ง€ํ˜œ, Poseidon์˜ ์ •ํ™•์„ฑ)์— ๋”ฐ๋ผ ์ž‘์—…์˜ ํ†ค์•ค๋งค๋„ˆ์™€ ๊ฒฐ๊ณผ๋ฌผ์˜ ํŠน์„ฑ์„ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **TDD ์‚ฌ์ดํด ๊ธฐ์—ฌ**: ์ž์‹ ์˜ ์ž‘์—…์ด ์ „์ฒด TDD ๊ฐœ๋ฐœ ์‚ฌ์ดํด์˜ ์–ด๋А ๋‹จ๊ณ„์— ๊ธฐ์—ฌํ•˜๋Š”์ง€ ์ธ์ง€ํ•˜๊ณ , ๋‹ค์Œ ๋‹จ๊ณ„๋กœ์˜ ์›ํ™œํ•œ ์ „ํ™˜์„ ๋ชฉํ‘œ๋กœ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +## 2. ๐Ÿ“ฅ ์ž…๋ ฅ ์ฒ˜๋ฆฌ ์›์น™ + +- **์ž…๋ ฅ ํŒŒ์ผ ์œ ํšจ์„ฑ ๊ฒ€์ฆ**: Zeus๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ์ž…๋ ฅ ํŒŒ์ผ(์˜ˆ: `feature_spec.md`, `test_spec.md`)์ด ์กด์žฌํ•˜๋ฉฐ, ๋‚ด์šฉ์ด ๋น„์–ด์žˆ์ง€ ์•Š์€์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **๊ตฌ์กฐ ๋ฐ ํ˜•์‹ ๋ถ„์„**: ์ž…๋ ฅ Markdown ํŒŒ์ผ์˜ ํ—ค๋”, ์ฝ”๋“œ ๋ธ”๋ก, ๋ชฉ๋ก ๋“ฑ ์˜ˆ์ƒ๋˜๋Š” ๊ตฌ์กฐ์™€ ํ˜•์‹์„ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•˜์—ฌ ์ž‘์—…์— ํ™œ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **๋ˆ„๋ฝ/์˜ค๋ฅ˜ ๋Œ€์‘**: ์ž…๋ ฅ ๋‚ด์šฉ์— ์ค‘์š”ํ•œ ์ •๋ณด๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ๊ฑฐ๋‚˜ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, ์ž‘์—…์„ ์ค‘๋‹จํ•˜๊ณ  Zeus์—๊ฒŒ ๋ณด๊ณ ํ•˜๊ฑฐ๋‚˜ (ํ˜„์žฌ ์‹œ์Šคํ…œ์—์„œ๋Š” ํŒŒ์ผ ์ƒ์„ฑ ์‹คํŒจ๋กœ Zeus๊ฐ€ ๊ฐ์ง€) ํ•ฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ๊ฐ’์„ ์ ์šฉํ•˜๋Š” ๋ฐฉ์•ˆ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +## 3. ๐Ÿ“ค ์ถœ๋ ฅ ์ƒ์„ฑ ์›์น™ + +- **๋ช…์„ธ ์ค€์ˆ˜**: `agents_spec.md`์— ์ •์˜๋œ ์ž์‹ ์˜ ์ถœ๋ ฅ ํŒŒ์ผ๋ช…(์˜ˆ: `test_code.md`, `impl_code.md`), ์ €์žฅ ๊ฒฝ๋กœ(`docs/sessions/tdd_YYYY-MM-DD_NNN/`), ๊ทธ๋ฆฌ๊ณ  Markdown ํ˜•์‹(ํ—ค๋” ๋ ˆ๋ฒจ, ์ฝ”๋“œ ๋ธ”๋ก ์–ธ์–ด ์ง€์ • ๋“ฑ)์„ ์—„๊ฒฉํžˆ ์ค€์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **๋ช…ํ™•์„ฑ ๋ฐ ๊ฐ„๊ฒฐ์„ฑ**: ์ƒ์„ฑํ•˜๋Š” ์ถœ๋ ฅ Markdown ํŒŒ์ผ์€ ๋‹ค์Œ ๋‹จ๊ณ„ ์—์ด์ „ํŠธ๊ฐ€ ์ถ”๊ฐ€์ ์ธ ํ•ด์„ ์—†์ด ์ฆ‰์‹œ ์ž‘์—…์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ•„์š”ํ•œ ์„œ๋ก ์ด๋‚˜ ๋ฐ˜๋ณต์ ์ธ ๋‚ด์šฉ์€ ์ง€์–‘ํ•ฉ๋‹ˆ๋‹ค. +- **์™„์ „์„ฑ**: ๋‹ค์Œ ๋‹จ๊ณ„ ์—์ด์ „ํŠธ์˜ ์ž‘์—…์„ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด(์˜ˆ: ์ฝ”๋“œ ์Šค๋‹ˆํŽซ, ์ƒ์„ธ ์„ค๋ช…, ์ฐธ์กฐ ๋งํฌ)๋ฅผ ๋น ์ง์—†์ด ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **์ฝ”๋“œ ๋ธ”๋ก ๊ฐ€์ด๋“œ**: ์ฝ”๋“œ ๋ธ”๋ก์„ ํฌํ•จํ•  ๊ฒฝ์šฐ, ๋ฐ˜๋“œ์‹œ ์˜ฌ๋ฐ”๋ฅธ ์–ธ์–ด(์˜ˆ: ``typescript`, ``javascript`, ````markdown`)๋ฅผ ์ง€์ •ํ•˜์—ฌ ์‹ ํƒ์Šค ํ•˜์ด๋ผ์ดํŒ…์ด ์ ์šฉ๋˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +## 4. ๐Ÿ”„ ์ปจํ…์ŠคํŠธ ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ + +- **`context.md` ๋ถˆ๋ณ€์„ฑ**: `context.md` ํŒŒ์ผ์€ Zeus๋งŒ์ด ๊ด€๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ์˜ ํ•ต์‹ฌ ์ƒํƒœ ๋ฌธ์„œ์ด๋ฏ€๋กœ, ์–ด๋– ํ•œ ๊ฒฝ์šฐ์—๋„ ์ง์ ‘ ์ˆ˜์ •ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. +- **Zeus์˜ ์ „ํ™˜ ์กฐ๊ฑด ์ถฉ์กฑ**: ์ž์‹ ์˜ ์ž‘์—… ์™„๋ฃŒ ํ›„, Zeus๊ฐ€ `agents_spec.md`์— ๋ช…์‹œ๋œ ์ „ํ™˜ ์กฐ๊ฑด(์˜ˆ: ํŠน์ • ํŒŒ์ผ ์ƒ์„ฑ ํ™•์ธ)์„ ๊ฐ์ง€ํ•˜๊ณ  ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ํ•„์š”ํ•œ ์‚ฐ์ถœ๋ฌผ์„ ์ •ํ™•ํžˆ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +## 5. โœจ ํ’ˆ์งˆ ๋ฐ ํ‘œ์ค€ ์ค€์ˆ˜ + +- **๋†’์€ ํ’ˆ์งˆ์˜ ์‚ฐ์ถœ๋ฌผ**: ์ƒ์„ฑํ•˜๋Š” ๋ชจ๋“  Markdown ๋ฌธ์„œ์˜ ๋‚ด์šฉ(ํ…์ŠคํŠธ, ์ฝ”๋“œ)์€ ์˜คํƒˆ์ž, ๋ฌธ๋ฒ• ์˜ค๋ฅ˜, ๋…ผ๋ฆฌ์  ๋น„์•ฝ ์—†์ด ๋†’์€ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **์ฝ”๋”ฉ ์ปจ๋ฒค์…˜ (์ฝ”๋“œ ๊ด€๋ จ)**: ์ฝ”๋“œ ์ƒ์„ฑ ๋˜๋Š” ์ˆ˜์ •์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ, ํ”„๋กœ์ ํŠธ์˜ `.prettierrc`, `eslint.config.js`, `tsconfig.json` ๋“ฑ์— ์ •์˜๋œ ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜(ํฌ๋งทํŒ…, ์Šคํƒ€์ผ, ํƒ€์ž… ์ •์˜)์„ ์ฒ ์ €ํžˆ ์ค€์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **๋ณด์•ˆ ๊ณ ๋ ค**: API ํ‚ค, ๋น„๋ฐ€๋ฒˆํ˜ธ, ๊ฐœ์ธ ์‹๋ณ„ ์ •๋ณด ๋“ฑ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฐ์ถœ๋ฌผ์— ์ ˆ๋Œ€ ํฌํ•จ๋˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **์ฐธ์กฐ ์œ ํšจ์„ฑ**: ์‚ฐ์ถœ๋ฌผ ๋‚ด๋ถ€์— ๋‹ค๋ฅธ ํŒŒ์ผ์ด๋‚˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋งํฌ๊ฐ€ ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ๋งํฌ๊ฐ€ ์œ ํšจํ•˜๊ณ  ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +## 6. ๐Ÿšจ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฐ ๋ณด๊ณ  (Zeus ์—ฐ๋™) + +- **์˜ค๋ฅ˜ ๊ฐ์ง€**: ์ž‘์—… ์ค‘ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ œ(์˜ˆ: ์ž…๋ ฅ ํŒŒ์ผ ํŒŒ์‹ฑ ์‹คํŒจ, ๋กœ์ง ์˜ค๋ฅ˜)๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์ด๋ฅผ ๊ฐ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- **Zeus ๋ณด๊ณ  ๋ฉ”์ปค๋‹ˆ์ฆ˜**: ํ˜„์žฌ ์‹œ์Šคํ…œ์€ Zeus๊ฐ€ ํŒŒ์ผ ์ƒ์„ฑ ์—ฌ๋ถ€๋กœ ๋‹จ๊ณ„ ์ „ํ™˜์„ ํŒ๋‹จํ•˜๋ฏ€๋กœ, ์ž‘์—… ์‹คํŒจ ์‹œ ์˜๋„์ ์œผ๋กœ ์‚ฐ์ถœ๋ฌผ ์ƒ์„ฑ์„ ์ค‘๋‹จํ•˜์—ฌ Zeus๊ฐ€ ์ด๋ฅผ ๊ฐ์ง€ํ•˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (ํ–ฅํ›„ ์˜ค๋ฅ˜ ๋ณด๊ณ  ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์ถ”๊ฐ€๋  ๊ฒฝ์šฐ ํ•ด๋‹น ๊ฐ€์ด๋“œ๋ผ์ธ์„ ๋”ฐ๋ฆ„) + +--- + +## ๐Ÿ“ ๊ฐœ๋ณ„ ์—์ด์ „ํŠธ ๊ฐ€์ด๋“œ๋ผ์ธ + +_์ด ์„น์…˜์€ ๊ฐ ์—์ด์ „ํŠธ์˜ ํŠน์ • ์ž‘์—… ํ๋ฆ„, ๊ณ ๋ ค์‚ฌํ•ญ, ์˜ˆ์‹œ ๋“ฑ์„ ์ƒ์„ธํžˆ ๊ธฐ์ˆ ํ•ฉ๋‹ˆ๋‹ค._ + +- ... +- ... diff --git a/docs/templates/impl_code_template.md b/docs/templates/impl_code_template.md new file mode 100644 index 00000000..b8d842a3 --- /dev/null +++ b/docs/templates/impl_code_template.md @@ -0,0 +1,60 @@ +# ๐Ÿš€ ๊ตฌํ˜„ ์ฝ”๋“œ ๋ช…์„ธ (impl_code.md) + +> ์ด ๋ฌธ์„œ๋Š” Hermes ์—์ด์ „ํŠธ๊ฐ€ Poseidon ์—์ด์ „ํŠธ์˜ `test_code.md`๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ž‘์„ฑํ•œ ์‹ค์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. Apollo ์—์ด์ „ํŠธ๋Š” ์ด ๋ฌธ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง ๋ฐ ๊ฐœ์„  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋ฌธ์„œ๋Š” Apollo๊ฐ€ ์ถ”๊ฐ€์ ์ธ ์ •๋ณด ์—†์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ช…ํ™•ํ•˜๊ณ  ์™„์ „ํ•˜๊ฒŒ ์ž‘์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 1. ๐ŸŽฏ ๊ตฌํ˜„ ๋Œ€์ƒ ๋ฐ ๋ชฉ์  + +- **๊ตฌํ˜„ ๋Œ€์ƒ**: [Athena์˜ `feature_spec.md`์—์„œ ์ •์˜๋œ ๊ธฐ๋Šฅ ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ] +- **๊ตฌํ˜„ ๋ชฉ์ **: [Poseidon์˜ `test_code.md`์— ๋ช…์„ธ๋œ ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๊ณ , `feature_spec.md`์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„] + +--- + +## 2. ๐Ÿ› ๏ธ ๊ตฌํ˜„ ์ฝ”๋“œ + +```typescript +// Hermes ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์„ฑํ•œ ์‹ค์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์ฝ”๋“œ๊ฐ€ ์—ฌ๊ธฐ์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค. +// ์ด ์ฝ”๋“œ๋Š” Poseidon์ด ์ž‘์„ฑํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ํ†ต๊ณผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +// Apollo ์—์ด์ „ํŠธ๊ฐ€ ์ด ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ๋ฆฌํŒฉํ† ๋งํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. +// ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ์ฝ”๋“œ์˜ ํŠน์ • ๋ถ€๋ถ„์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์„ค๋ช… ์ฃผ์„์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +// ์˜ˆ์‹œ: +// import React, { useState, useCallback } from 'react'; +// +// interface MyComponentProps { +// initialValue?: number; +// } +// +// const MyComponent: React.FC = ({ initialValue = 0 }) => { +// const [count, setCount] = useState(initialValue); +// +// const increment = useCallback(() => { +// setCount(prevCount => prevCount + 1); +// }, []); +// +// return ( +//
+//

Count: {count}

+// +//
+// ); +// }; +// +// export default MyComponent; +``` + +--- + +## 3. ๐Ÿ“š ๊ด€๋ จ ๋ฌธ์„œ ๋ฐ ์ฐธ์กฐ + +- **`agents_spec.md`**: ์‹œ์Šคํ…œ ์ „์ฒด ๋ช…์„ธ +- [๊ธฐํƒ€ ๊ด€๋ จ ๋ฌธ์„œ ๋งํฌ ๋ฐ ์„ค๋ช…] + +--- + +## ๐Ÿ“ ๋ณ€๊ฒฝ ์ด๋ ฅ + +| ๋ฒ„์ „ | ๋‚ ์งœ | ๋ณ€๊ฒฝ ๋‚ด์šฉ | ์ž‘์„ฑ์ž | +| :--- | :--------- | :-------- | :----- | +| 1.0 | 2025-10-30 | ์ตœ์ดˆ ์ž‘์„ฑ | Gemini | diff --git a/docs/templates/refactor_report_template.md b/docs/templates/refactor_report_template.md new file mode 100644 index 00000000..33146526 --- /dev/null +++ b/docs/templates/refactor_report_template.md @@ -0,0 +1,99 @@ +# ๐Ÿ“ ๋ฆฌํŒฉํ† ๋ง ๋ณด๊ณ ์„œ (refactor_report.md) + +> ์ด ๋ฌธ์„œ๋Š” Apollo ์—์ด์ „ํŠธ๊ฐ€ Hermes ์—์ด์ „ํŠธ์˜ ๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•œ ํ›„ ์ƒ์„ฑํ•˜๋Š” ๋ณด๊ณ ์„œ์ž…๋‹ˆ๋‹ค. ๋ฆฌํŒฉํ† ๋ง์˜ ๋ชฉ์ , ๋ณ€๊ฒฝ ๋‚ด์šฉ, ๊ฐœ์„  ํšจ๊ณผ ๋ฐ ๊ด€๋ จ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ๋“ฑ์„ ์ƒ์„ธํžˆ ๊ธฐ๋กํ•˜์—ฌ ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฐœ์„  ๊ณผ์ •์„ ํˆฌ๋ช…ํ•˜๊ฒŒ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 1. ๐ŸŽฏ ๋ฆฌํŒฉํ† ๋ง ๊ฐœ์š” + +- **๋ฆฌํŒฉํ† ๋ง ๋Œ€์ƒ**: [Hermes๊ฐ€ ๊ตฌํ˜„ํ•œ ๊ธฐ๋Šฅ ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋ช…์นญ] +- **๋ฆฌํŒฉํ† ๋ง ๋ชฉ์ **: [์ฝ”๋“œ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ, ์žฌ์‚ฌ์šฉ์„ฑ ์ฆ๋Œ€, ์„ฑ๋Šฅ ์ตœ์ ํ™”, ์œ ์ง€๋ณด์ˆ˜์„ฑ ๊ฐœ์„  ๋“ฑ ๊ตฌ์ฒด์ ์ธ ๋ชฉํ‘œ] +- **๋ฆฌํŒฉํ† ๋ง ๋ฒ”์œ„**: [Hermes๊ฐ€ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•œ ์ฝ”๋“œ์— ํ•œ์ •ํ•˜์—ฌ ๋ฆฌํŒฉํ† ๋ง์„ ์ง„ํ–‰ํ–ˆ์Œ์„ ๋ช…์‹œ] + +--- + +## 2. ๐Ÿš€ ๋ฆฌํŒฉํ† ๋ง ์ „ ์ฝ”๋“œ ์ƒํƒœ + +```typescript +// ๋ฆฌํŒฉํ† ๋ง ์ „ Hermes๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์˜ ์ฃผ์š” ๋ถ€๋ถ„ ๋˜๋Š” ์ „์ฒด ์ฝ”๋“œ๋ฅผ ์—ฌ๊ธฐ์— ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. +// Apollo ์—์ด์ „ํŠธ๊ฐ€ ๋ฆฌํŒฉํ† ๋ง์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์˜ ์ฝ”๋“œ ์Šค๋ƒ…์ƒท์ž…๋‹ˆ๋‹ค. +// ์˜ˆ์‹œ: +// const calculateTotal = (items, taxRate) => { +// let total = 0; +// for (let i = 0; i < items.length; i++) { +// total += items[i].price * items[i].quantity; +// } +// total += total * taxRate; +// return total; +// }; +``` + +--- + +## 3. โœจ ๋ฆฌํŒฉํ† ๋ง ๋‚ด์šฉ ๋ฐ ๊ฐœ์„  ํšจ๊ณผ + +### 3.1. ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์š”์•ฝ + +- [๋ณ€๊ฒฝ ์‚ฌํ•ญ 1: ์˜ˆ์‹œ - ํ•จ์ˆ˜ `calculateTotal`์„ `calculateSubtotal`๊ณผ `applyTax`๋กœ ๋ถ„๋ฆฌ] +- [๋ณ€๊ฒฝ ์‚ฌํ•ญ 2: ์˜ˆ์‹œ - ๋งค์ง ๋„˜๋ฒ„๋ฅผ ์ƒ์ˆ˜๋กœ ๋Œ€์ฒด] +- [๋ณ€๊ฒฝ ์‚ฌํ•ญ 3: ์˜ˆ์‹œ - ๋ณ€์ˆ˜๋ช… `i`๋ฅผ `itemIndex`๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ] + +### 3.2. ์ƒ์„ธ ๋ณ€๊ฒฝ ๋‚ด์šฉ ๋ฐ ์ด์œ  + +- **[๋ณ€๊ฒฝ ์‚ฌํ•ญ 1 ์ƒ์„ธ]**: + - **๋ณ€๊ฒฝ ์ „**: [๊ฐ„๋žตํ•œ ์ฝ”๋“œ ์Šค๋‹ˆํŽซ ๋˜๋Š” ์„ค๋ช…] + - **๋ณ€๊ฒฝ ํ›„**: [๊ฐ„๋žตํ•œ ์ฝ”๋“œ ์Šค๋‹ˆํŽซ ๋˜๋Š” ์„ค๋ช…] + - **๋ณ€๊ฒฝ ์ด์œ **: [ํ•ด๋‹น ๋ณ€๊ฒฝ์ด ์ฝ”๋“œ ํ’ˆ์งˆ(๊ฐ€๋…์„ฑ, ์žฌ์‚ฌ์šฉ์„ฑ ๋“ฑ)์— ์–ด๋–ป๊ฒŒ ๊ธฐ์—ฌํ•˜๋Š”์ง€ ์„ค๋ช…] + - **๊ฐœ์„  ํšจ๊ณผ**: [์˜ˆ: ๋‹จ์ผ ์ฑ…์ž„ ์›์น™ ์ค€์ˆ˜, ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ ์ฆ๋Œ€] + +- **[๋ณ€๊ฒฝ ์‚ฌํ•ญ 2 ์ƒ์„ธ]**: + - **๋ณ€๊ฒฝ ์ „**: [๊ฐ„๋žตํ•œ ์ฝ”๋“œ ์Šค๋‹ˆํŽซ ๋˜๋Š” ์„ค๋ช…] + - **๋ณ€๊ฒฝ ํ›„**: [๊ฐ„๋žตํ•œ ์ฝ”๋“œ ์Šค๋‹ˆํŽซ ๋˜๋Š” ์„ค๋ช…] + - **๋ณ€๊ฒฝ ์ด์œ **: [ํ•ด๋‹น ๋ณ€๊ฒฝ์ด ์ฝ”๋“œ ํ’ˆ์งˆ์— ์–ด๋–ป๊ฒŒ ๊ธฐ์—ฌํ•˜๋Š”์ง€ ์„ค๋ช…] + - **๊ฐœ์„  ํšจ๊ณผ**: [์˜ˆ: ์ฝ”๋“œ์˜ ์˜๋ฏธ ๋ช…ํ™•ํ™”, ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด์„ฑ ์ฆ๋Œ€] + +--- + +## 4. ๐Ÿงช ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ + +- **ํ…Œ์ŠคํŠธ ์‹คํ–‰ ๊ฒฐ๊ณผ**: ๋ฆฌํŒฉํ† ๋ง ํ›„ `pnpm run test` ๋ช…๋ น์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ **๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ํ†ต๊ณผ**ํ–ˆ์Šต๋‹ˆ๋‹ค. +- **๊ด€๋ จ ํ…Œ์ŠคํŠธ ํŒŒ์ผ**: `test_code.md` (Poseidon์ด ์ƒ์„ฑํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ) + +--- + +## 5. ๐Ÿš€ ๋ฆฌํŒฉํ† ๋ง ํ›„ ์ฝ”๋“œ ์ƒํƒœ + +```typescript +// ๋ฆฌํŒฉํ† ๋ง ํ›„ ์ตœ์ข…์ ์œผ๋กœ ๊ฐœ์„ ๋œ ๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ ์—ฌ๊ธฐ์— ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. +// ์ด ์ฝ”๋“œ๋Š” Apollo ์—์ด์ „ํŠธ์˜ ๋ฆฌํŒฉํ† ๋ง ์ž‘์—…์ด ์™„๋ฃŒ๋œ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฌผ์ž…๋‹ˆ๋‹ค. +// ์˜ˆ์‹œ: +// const TAX_RATE = 0.075; // ์ƒ์ˆ˜๋กœ ์ •์˜ +// +// const calculateSubtotal = (items) => { +// return items.reduce((total, item) => total + item.price * item.quantity, 0); +// }; +// +// const applyTax = (subtotal, taxRate) => { +// return subtotal + subtotal * taxRate; +// }; +// +// const calculateTotal = (items) => { +// const subtotal = calculateSubtotal(items); +// return applyTax(subtotal, TAX_RATE); +// }; +``` + +--- + +## 6. ๐Ÿ“š ๊ด€๋ จ ๋ฌธ์„œ ๋ฐ ์ฐธ์กฐ + +- **`agents_spec.md`**: ์‹œ์Šคํ…œ ์ „์ฒด ๋ช…์„ธ +- [๊ธฐํƒ€ ๊ด€๋ จ ๋ฌธ์„œ ๋งํฌ ๋ฐ ์„ค๋ช…] + +--- + +## 7. ๐Ÿ“ ๋ณ€๊ฒฝ ์ด๋ ฅ + +| ๋ฒ„์ „ | ๋‚ ์งœ | ๋ณ€๊ฒฝ ๋‚ด์šฉ | ์ž‘์„ฑ์ž | +| :--- | :--------- | :-------- | :----- | +| 1.0 | 2025-10-30 | ์ตœ์ดˆ ์ž‘์„ฑ | Gemini | diff --git a/docs/templates/test_code_template.md b/docs/templates/test_code_template.md new file mode 100644 index 00000000..8caa173f --- /dev/null +++ b/docs/templates/test_code_template.md @@ -0,0 +1,65 @@ +# ๐Ÿงช ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋ช…์„ธ (test_code.md) + +> ์ด ๋ฌธ์„œ๋Š” Poseidon ์—์ด์ „ํŠธ๊ฐ€ Artemis ์—์ด์ „ํŠธ์˜ `test_spec.md`๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ์‹ค์ œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. Vitest์™€ React Testing Library(RTL)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ, TDD ์‚ฌ์ดํด์˜ "Red" ๋‹จ๊ณ„๋ฅผ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 1. ๐ŸŽฏ ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ๋ฐ ๋ชฉ์  + +- **ํ…Œ์ŠคํŠธ ๋Œ€์ƒ**: [Artemis์˜ `test_spec.md`์—์„œ ์ •์˜๋œ ๊ธฐ๋Šฅ ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ] +- **ํ…Œ์ŠคํŠธ ๋ชฉ์ **: [ํ•ด๋‹น ๊ธฐ๋Šฅ/์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ์šฉ์ž ์š”๊ตฌ์‚ฌํ•ญ ๋ฐ ๊ธฐ๋Šฅ ๋ช…์„ธ์— ๋”ฐ๋ผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ๊ฒ€์ฆ] + +--- + +## 2. ๐Ÿš€ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ์„ค์ • ๋ฐ ์œ ํ‹ธ๋ฆฌํ‹ฐ + +- **ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ**: Vitest +- **๋ Œ๋”๋ง ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ**: React Testing Library (RTL) +- **๊ณตํ†ต ์œ ํ‹ธ๋ฆฌํ‹ฐ**: `src/__tests__/utils.ts` (ํ•„์š”์‹œ) +- **๋ชฉ(Mock) ๋ฐ์ดํ„ฐ**: `src/__mocks__/` ๋””๋ ‰ํ† ๋ฆฌ ํ™œ์šฉ (ํ•„์š”์‹œ) +- **ํ™˜๊ฒฝ ์„ค์ •**: `setupTests.ts` (์ „์—ญ ์„ค์ •) + +--- + +## 3. ๐Ÿงช ํ…Œ์ŠคํŠธ ์ฝ”๋“œ + +```typescript +// Poseidon์€ ์ด ์ฝ”๋“œ ๋ธ”๋ก ๋‚ด๋ถ€์— ์‹ค์ œ ํ…Œ์ŠคํŠธ ๋กœ์ง์„ ์ฑ„์›Œ ๋„ฃ์Šต๋‹ˆ๋‹ค. +// ๋˜ํ•œ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ํ•จ์ˆ˜๋‚˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•„ ๋ฐœ์ƒํ•˜๋Š” import/ํƒ€์ž… ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, +// ํ•ด๋‹น ํ•จ์ˆ˜๋‚˜ ์ปดํฌ๋„ŒํŠธ์˜ ์Šค์ผˆ๋ ˆํ†ค ํŒŒ์ผ์„ ํ•จ๊ป˜ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +// ์Šค์ผˆ๋ ˆํ†ค ํŒŒ์ผ์€ ์ตœ์†Œํ•œ์˜ ๋‚ด์šฉ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•˜๋ฉฐ, ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +// test_spec.md์—์„œ ์ •์˜๋œ describe/it ๋ธ”๋ก ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ, +// Vitest์™€ React Testing Library๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. +// TDD ์›์น™์— ๋”ฐ๋ผ, ์ด ์ฝ”๋“œ๋Š” Hermes ์—์ด์ „ํŠธ๊ฐ€ ๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์ „์—๋Š” ์‹คํŒจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +// ์˜ˆ์‹œ: +// import { render, screen } from '@testing-library/react'; +// import MyComponent from '../src/components/MyComponent'; + +// describe('MyComponent', () => { +// it('should render correctly', () => { +// render(); +// expect(screen.getByText('Hello')).toBeInTheDocument(); +// }); +// }); + +// Artemis๊ฐ€ ์ƒ์„ฑํ•œ describe/it ๋ธ”๋ก์ด ์—ฌ๊ธฐ์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค. +// Poseidon์€ ์ด ๋ธ”๋ก ๋‚ด๋ถ€์— ์‹ค์ œ ํ…Œ์ŠคํŠธ ๋กœ์ง์„ ์ฑ„์›Œ ๋„ฃ์Šต๋‹ˆ๋‹ค. +``` + +--- + +## 4. ๐Ÿ“š ๊ด€๋ จ ๋ฌธ์„œ ๋ฐ ์ฐธ์กฐ + +- **`agents_spec.md`**: ์‹œ์Šคํ…œ ์ „์ฒด ๋ช…์„ธ +- **`feature_spec.md`**: Athena์˜ ์ถœ๋ ฅ์œผ๋กœ ์ƒ์„ฑ๋œ ๊ธฐ๋Šฅ ๋ช…์„ธ์„œ +- [๊ธฐํƒ€ ๊ด€๋ จ ๋ฌธ์„œ ๋งํฌ ๋ฐ ์„ค๋ช…] + +--- + +## ๐Ÿ“ ๋ณ€๊ฒฝ ์ด๋ ฅ + +| ๋ฒ„์ „ | ๋‚ ์งœ | ๋ณ€๊ฒฝ ๋‚ด์šฉ | ์ž‘์„ฑ์ž | +| :--- | :--------- | :-------- | :------- | +| 1.0 | YYYY-MM-DD | ์ตœ์ดˆ ์ž‘์„ฑ | [์ž‘์„ฑ์ž] | diff --git a/docs/templates/test_spec_template.md b/docs/templates/test_spec_template.md new file mode 100644 index 00000000..537e96c3 --- /dev/null +++ b/docs/templates/test_spec_template.md @@ -0,0 +1,137 @@ +# ๐Ÿงช ํ…Œ์ŠคํŠธ ์„ค๊ณ„ ๋ช…์„ธ์„œ (Test Specification Document) + +> ์ด ๋ฌธ์„œ๋Š” ๊ธฐ๋Šฅ ๋ช…์„ธ์„œ(`feature_spec.md`)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ…Œ์ŠคํŠธ ์ „๋žต, ์‹œ๋‚˜๋ฆฌ์˜ค, ์ผ€์ด์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. Poseidon ์—์ด์ „ํŠธ๊ฐ€ ์ด ๋ฌธ์„œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‹ค์ œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ช…ํ™•ํ•˜๊ณ  ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ์ž‘์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +--- + +## 1. ๐ŸŽฏ ํ…Œ์ŠคํŠธ ์ „๋žต (Test Strategy) + +### 1.1 ํ…Œ์ŠคํŠธ ๋ชฉํ‘œ + +[์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๋‹ฌ์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ์ฃผ์š” ๋ชฉํ‘œ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: ํ•ต์‹ฌ ๊ธฐ๋Šฅ์˜ ์ •์ƒ ๋™์ž‘ ๊ฒ€์ฆ, ์ฃผ์š” ์˜ˆ์™ธ ์ƒํ™ฉ ์ฒ˜๋ฆฌ ํ™•์ธ] + +### 1.2 ํ…Œ์ŠคํŠธ ๋ฒ”์œ„ + +[ํ…Œ์ŠคํŠธ ๋Œ€์ƒ์ด ๋˜๋Š” ๊ธฐ๋Šฅ์˜ ๋ฒ”์œ„์™€ ์ œ์™ธ๋˜๋Š” ๋ฒ”์œ„๋ฅผ ๋ช…ํ™•ํžˆ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. (์˜ˆ: ๋‹จ์œ„ ํ…Œ์ŠคํŠธ, ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ, E2E ํ…Œ์ŠคํŠธ ๋“ฑ)] + +### 1.3 ํ…Œ์ŠคํŠธ ์œ ํ˜• ๋ฐ ์ ‘๊ทผ ๋ฐฉ์‹ + +[์ ์šฉํ•  ํ…Œ์ŠคํŠธ ์œ ํ˜•(์˜ˆ: ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ, ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ, ๋ณด์•ˆ ํ…Œ์ŠคํŠธ)๊ณผ ๊ฐ ์œ ํ˜•์— ๋Œ€ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.] + +### 1.4 ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๋ฐ ๋„๊ตฌ (์„ ํƒ ์‚ฌํ•ญ) + +[ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ํ™˜๊ฒฝ(์˜ˆ: ๊ฐœ๋ฐœ ํ™˜๊ฒฝ, ์Šคํ…Œ์ด์ง• ํ™˜๊ฒฝ) ๋ฐ ์‚ฌ์šฉํ•  ์ฃผ์š” ๋„๊ตฌ(์˜ˆ: Vitest, React Testing Library)๋ฅผ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.] + +--- + +## 2. ๐Ÿš€ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค (Test Scenarios) + +[๊ฐ ๊ธฐ๋Šฅ ๋˜๋Š” ํ•˜์œ„ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ Given-When-Then ํ˜•์‹์œผ๋กœ ์ƒ์„ธํ•˜๊ฒŒ ๊ธฐ์ˆ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๊ด€์ ์˜ ํ๋ฆ„๊ณผ ์‹œ์Šคํ…œ์˜ ์˜ˆ์ƒ ๋™์ž‘์„ ๋ช…ํ™•ํžˆ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค.] + +### 2.1 [๊ธฐ๋Šฅ๋ช… ๋˜๋Š” ํ•˜์œ„ ๊ธฐ๋Šฅ๋ช…] - [์‹œ๋‚˜๋ฆฌ์˜ค๋ช… 1] + +#### Given + +[ํ…Œ์ŠคํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ์ดˆ๊ธฐ ์กฐ๊ฑด ๋˜๋Š” ์ „์ œ ์ƒํƒœ] + +- ์‚ฌ์šฉ์ž A๋Š” ๋กœ๊ทธ์ธ๋˜์–ด ์žˆ๋‹ค. +- ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์ƒํ’ˆ X๊ฐ€ ๋‹ด๊ฒจ ์žˆ๋‹ค. + +#### When + +[ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ์‹œ์Šคํ…œ์— ๊ฐ€ํ•ด์ง€๋Š” ํŠน์ • ๋™์ž‘ ๋˜๋Š” ์ด๋ฒคํŠธ] + +- ์‚ฌ์šฉ์ž๊ฐ€ '๊ฒฐ์ œํ•˜๊ธฐ' ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ๋‹ค. +- ์‹œ์Šคํ…œ์ด ๊ฒฐ์ œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. + +#### Then + +[๋™์ž‘ ๋˜๋Š” ์ด๋ฒคํŠธ ๋ฐœ์ƒ ํ›„ ์‹œ์Šคํ…œ์˜ ์˜ˆ์ƒ ๊ฒฐ๊ณผ ๋˜๋Š” ์ƒํƒœ ๋ณ€ํ™”] + +- ์ฃผ๋ฌธ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค. +- ์‚ฌ์šฉ์ž์—๊ฒŒ '๊ฒฐ์ œ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค' ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค. +- ์žฅ๋ฐ”๊ตฌ๋‹ˆ๊ฐ€ ๋น„์›Œ์ง„๋‹ค. + +### 2.2 [๊ธฐ๋Šฅ๋ช… ๋˜๋Š” ํ•˜์œ„ ๊ธฐ๋Šฅ๋ช…] - [์‹œ๋‚˜๋ฆฌ์˜ค๋ช… 2] + +... + +--- + +## 3. ๐Ÿงช ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค (Test Cases) + +[๊ฐ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ž…๋ ฅ ๊ฐ’, ์˜ˆ์ƒ ๊ฒฐ๊ณผ, ํ…Œ์ŠคํŠธ ์กฐ๊ฑด ๋“ฑ์„ ๋ช…ํ™•ํžˆ ๋ช…์‹œํ•˜์—ฌ Poseidon์ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.] + +### 3.1 [์‹œ๋‚˜๋ฆฌ์˜ค๋ช…] - [ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ช… 1] + +- **์„ค๋ช…**: [ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์„ค๋ช…] +- **์ž…๋ ฅ ๋ฐ์ดํ„ฐ**: + - `[ํ•„๋“œ๋ช…]`: `[๊ฐ’]` + - `username`: `validUser` + - `password`: `validPassword123!` +- **์‚ฌ์ „ ์กฐ๊ฑด**: [ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์‹คํ–‰ ์ „ ํ•„์š”ํ•œ ํŠน์ • ์กฐ๊ฑด] +- **๊ธฐ๋Œ€ ๊ฒฐ๊ณผ**: [ํ…Œ์ŠคํŠธ ์‹คํ–‰ ํ›„ ์˜ˆ์ƒ๋˜๋Š” ๊ฒฐ๊ณผ] + - `API ์‘๋‹ต`: `HTTP 200 OK` + - `์‘๋‹ต ๋ณธ๋ฌธ`: `{ "success": true, "token": "..." }` + - `UI ์ƒํƒœ`: `๋กœ๊ทธ์ธ ์„ฑ๊ณต ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ` + +### 3.2 [์‹œ๋‚˜๋ฆฌ์˜ค๋ช…] - [ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ช… 2] + +... + +--- + +## 4. ๐Ÿ’ป ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋ธ”๋ก (Test Code Blocks for Poseidon) + +> Poseidon ์—์ด์ „ํŠธ๊ฐ€ ์ด ์„น์…˜์˜ ๋นˆ ์ฝ”๋“œ ๋ธ”๋ก ๋‚ด๋ถ€์— ์‹ค์ œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. Artemis๋Š” `feature_spec.md`์˜ ๊ธฐ๋Šฅ ๊ตฌ์กฐ์— ๋งž์ถฐ `Vitest` ๋ฐ `React Testing Library` ๊ธฐ๋ฐ˜์˜ ํ…Œ์ŠคํŠธ ํŒŒ์ผ ๊ตฌ์กฐ์™€ ๋นˆ `describe`/`it` ๋ธ”๋ก์„ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. + +### 4.1 [ํ…Œ์ŠคํŠธ ํŒŒ์ผ๋ช… 1].test.ts + +```typescript +import { describe, it, expect } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; + +describe('[๊ธฐ๋Šฅ๋ช… ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ช…]', () => { + it('[ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ช… 1]', () => { + // Given + // When + // Then + }); + + it('[ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ช… 2]', () => { + // Given + // When + // Then + }); +}); +``` + +### 4.2 [ํ…Œ์ŠคํŠธ ํŒŒ์ผ๋ช… 2].test.ts + +```typescript +import { describe, it, expect } from 'vitest'; + +describe('[์œ ํ‹ธ๋ฆฌํ‹ฐ ๋˜๋Š” ํ›…์Šค๋ช…]', () => { + it('[ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ช… 1]', () => { + // Given + // When + // Then + }); +}); +``` + +--- + +## 5. ๐Ÿ“š ๊ด€๋ จ ๋ฌธ์„œ ๋ฐ ์ฐธ์กฐ + +- **`agents_spec.md`**: ์‹œ์Šคํ…œ ์ „์ฒด ๋ช…์„ธ +- [๊ธฐํƒ€ ๊ด€๋ จ ๋ฌธ์„œ ๋งํฌ ๋ฐ ์„ค๋ช…] + +--- + +## ๐Ÿ“ ๋ณ€๊ฒฝ ์ด๋ ฅ + +| ๋ฒ„์ „ | ๋‚ ์งœ | ๋ณ€๊ฒฝ ๋‚ด์šฉ | ์ž‘์„ฑ์ž | +| :--- | :--------- | :-------- | :------- | +| 1.0 | YYYY-MM-DD | ์ตœ์ดˆ ์ž‘์„ฑ | [์ž‘์„ฑ์ž] | diff --git a/index.html b/index.html index 11222ae1..9ed34aa1 100644 --- a/index.html +++ b/index.html @@ -1,12 +1,12 @@ - - - - ์ผ์ •๊ด€๋ฆฌ ์•ฑ์œผ๋กœ ํ•™์Šตํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ - - -
- - + + + + ์ผ์ •๊ด€๋ฆฌ ์•ฑ์œผ๋กœ ํ•™์Šตํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ + + +
+ + diff --git a/package.json b/package.json index 73d85b72..b1b310c5 100644 --- a/package.json +++ b/package.json @@ -8,11 +8,13 @@ "server:watch": "node --watch server.js", "start": "vite", "dev": "concurrently \"pnpm run server:watch\" \"pnpm run start\"", - "test": "vitest", + "test": "pnpm run format && pnpm run lint:fix && vitest --run", "test:ui": "vitest --ui", "test:coverage": "vitest run --coverage", "build": "tsc -b && vite build", + "format": "prettier --write .", "lint:eslint": "eslint . --ext ts,tsx --report-unused-disable-directives", + "lint:fix": "eslint . --ext ts,tsx --report-unused-disable-directives --fix", "lint:tsc": "tsc --pretty", "lint": "pnpm lint:eslint && pnpm lint:tsc" }, @@ -25,6 +27,7 @@ "framer-motion": "^12.23.0", "msw": "^2.10.3", "notistack": "^3.0.2", + "prettier": "^3.6.2", "react": "19.1.0", "react-dom": "19.1.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b3848a91..2228caf1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,7 +5,6 @@ settings: excludeLinksFromLockfile: false importers: - .: dependencies: '@emotion/react': @@ -32,6 +31,9 @@ importers: notistack: specifier: ^3.0.2 version: 3.0.2(csstype@3.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + prettier: + specifier: ^3.6.2 + version: 3.6.2 react: specifier: 19.1.0 version: 19.1.0 @@ -89,7 +91,7 @@ importers: version: 2.32.0(@typescript-eslint/parser@8.35.0(eslint@9.30.0)(typescript@5.6.3))(eslint@9.30.0) eslint-plugin-prettier: specifier: ^5.5.1 - version: 5.5.1(@types/eslint@8.56.12)(eslint-config-prettier@10.1.5(eslint@9.30.0))(eslint@9.30.0)(prettier@3.3.3) + version: 5.5.1(@types/eslint@8.56.12)(eslint-config-prettier@10.1.5(eslint@9.30.0))(eslint@9.30.0)(prettier@3.6.2) eslint-plugin-react: specifier: ^7.37.0 version: 7.37.2(eslint@9.30.0) @@ -98,7 +100,7 @@ importers: version: 5.2.0(eslint@9.30.0) eslint-plugin-storybook: specifier: ^9.0.14 - version: 9.0.14(eslint@9.30.0)(storybook@9.0.14(@testing-library/dom@10.4.0)(prettier@3.3.3))(typescript@5.6.3) + version: 9.0.14(eslint@9.30.0)(storybook@9.0.14(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.6.3) eslint-plugin-vitest: specifier: ^0.5.4 version: 0.5.4(@typescript-eslint/eslint-plugin@8.35.0(@typescript-eslint/parser@8.35.0(eslint@9.30.0)(typescript@5.6.3))(eslint@9.30.0)(typescript@5.6.3))(eslint@9.30.0)(typescript@5.6.3)(vitest@3.2.4) @@ -122,122 +124,211 @@ importers: version: 3.2.4(@types/node@22.18.8)(@vitest/ui@3.2.4)(jsdom@26.1.0)(msw@2.10.3(@types/node@22.18.8)(typescript@5.6.3)) packages: - '@adobe/css-tools@4.4.0': - resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} + resolution: + { + integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==, + } '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==, + } + engines: { node: '>=6.0.0' } '@asamuzakjp/css-color@3.2.0': - resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} + resolution: + { + integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==, + } '@babel/code-frame@7.26.0': - resolution: {integrity: sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g==, + } + engines: { node: '>=6.9.0' } '@babel/generator@7.26.0': - resolution: {integrity: sha512-/AIkAmInnWwgEAJGQr9vY0c66Mj6kjkE2ZPB1PurTRaRAh3U+J45sAQMjQDJdh4WbR3l0x5xkimXBKyBXXAu2w==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-/AIkAmInnWwgEAJGQr9vY0c66Mj6kjkE2ZPB1PurTRaRAh3U+J45sAQMjQDJdh4WbR3l0x5xkimXBKyBXXAu2w==, + } + engines: { node: '>=6.9.0' } '@babel/helper-module-imports@7.25.9': - resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==, + } + engines: { node: '>=6.9.0' } '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==, + } + engines: { node: '>=6.9.0' } '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==, + } + engines: { node: '>=6.9.0' } '@babel/parser@7.26.1': - resolution: {integrity: sha512-reoQYNiAJreZNsJzyrDNzFQ+IQ5JFiIzAHJg9bn94S3l+4++J7RsIhNMoB+lgP/9tpmiAQqspv+xfdxTSzREOw==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-reoQYNiAJreZNsJzyrDNzFQ+IQ5JFiIzAHJg9bn94S3l+4++J7RsIhNMoB+lgP/9tpmiAQqspv+xfdxTSzREOw==, + } + engines: { node: '>=6.0.0' } hasBin: true '@babel/runtime@7.26.0': - resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==, + } + engines: { node: '>=6.9.0' } '@babel/runtime@7.27.6': - resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==, + } + engines: { node: '>=6.9.0' } '@babel/template@7.25.9': - resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==, + } + engines: { node: '>=6.9.0' } '@babel/traverse@7.25.9': - resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==, + } + engines: { node: '>=6.9.0' } '@babel/types@7.26.0': - resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==, + } + engines: { node: '>=6.9.0' } '@bcoe/v8-coverage@0.2.3': - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + resolution: + { + integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==, + } '@bundled-es-modules/cookie@2.0.1': - resolution: {integrity: sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==} + resolution: + { + integrity: sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==, + } '@bundled-es-modules/statuses@1.0.1': - resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} + resolution: + { + integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==, + } '@bundled-es-modules/tough-cookie@0.1.6': - resolution: {integrity: sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==} + resolution: + { + integrity: sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==, + } '@csstools/color-helpers@5.0.2': - resolution: {integrity: sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==, + } + engines: { node: '>=18' } '@csstools/css-calc@2.1.4': - resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==, + } + engines: { node: '>=18' } peerDependencies: '@csstools/css-parser-algorithms': ^3.0.5 '@csstools/css-tokenizer': ^3.0.4 '@csstools/css-color-parser@3.0.10': - resolution: {integrity: sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==, + } + engines: { node: '>=18' } peerDependencies: '@csstools/css-parser-algorithms': ^3.0.5 '@csstools/css-tokenizer': ^3.0.4 '@csstools/css-parser-algorithms@3.0.5': - resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==, + } + engines: { node: '>=18' } peerDependencies: '@csstools/css-tokenizer': ^3.0.4 '@csstools/css-tokenizer@3.0.4': - resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==, + } + engines: { node: '>=18' } '@emotion/babel-plugin@11.12.0': - resolution: {integrity: sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==} + resolution: + { + integrity: sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==, + } '@emotion/cache@11.13.1': - resolution: {integrity: sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==} + resolution: + { + integrity: sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==, + } '@emotion/cache@11.14.0': - resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} + resolution: + { + integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==, + } '@emotion/hash@0.9.2': - resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + resolution: + { + integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==, + } '@emotion/is-prop-valid@1.3.1': - resolution: {integrity: sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==} + resolution: + { + integrity: sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==, + } '@emotion/memoize@0.9.0': - resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + resolution: + { + integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==, + } '@emotion/react@11.13.3': - resolution: {integrity: sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==} + resolution: + { + integrity: sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==, + } peerDependencies: '@types/react': '*' react: '>=16.8.0' @@ -246,16 +337,28 @@ packages: optional: true '@emotion/serialize@1.3.2': - resolution: {integrity: sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA==} + resolution: + { + integrity: sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA==, + } '@emotion/serialize@1.3.3': - resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==} + resolution: + { + integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==, + } '@emotion/sheet@1.4.0': - resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} + resolution: + { + integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==, + } '@emotion/styled@11.13.0': - resolution: {integrity: sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==} + resolution: + { + integrity: sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==, + } peerDependencies: '@emotion/react': ^11.0.0-rc.0 '@types/react': '*' @@ -265,300 +368,483 @@ packages: optional: true '@emotion/unitless@0.10.0': - resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} + resolution: + { + integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==, + } '@emotion/use-insertion-effect-with-fallbacks@1.1.0': - resolution: {integrity: sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==} + resolution: + { + integrity: sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==, + } peerDependencies: react: '>=16.8.0' '@emotion/utils@1.4.1': - resolution: {integrity: sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA==} + resolution: + { + integrity: sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA==, + } '@emotion/utils@1.4.2': - resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} + resolution: + { + integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==, + } '@emotion/weak-memoize@0.4.0': - resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} + resolution: + { + integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==, + } '@esbuild/aix-ppc64@0.25.5': - resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==, + } + engines: { node: '>=18' } cpu: [ppc64] os: [aix] '@esbuild/android-arm64@0.25.5': - resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==, + } + engines: { node: '>=18' } cpu: [arm64] os: [android] '@esbuild/android-arm@0.25.5': - resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==, + } + engines: { node: '>=18' } cpu: [arm] os: [android] '@esbuild/android-x64@0.25.5': - resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==, + } + engines: { node: '>=18' } cpu: [x64] os: [android] '@esbuild/darwin-arm64@0.25.5': - resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==, + } + engines: { node: '>=18' } cpu: [arm64] os: [darwin] '@esbuild/darwin-x64@0.25.5': - resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==, + } + engines: { node: '>=18' } cpu: [x64] os: [darwin] '@esbuild/freebsd-arm64@0.25.5': - resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==, + } + engines: { node: '>=18' } cpu: [arm64] os: [freebsd] '@esbuild/freebsd-x64@0.25.5': - resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==, + } + engines: { node: '>=18' } cpu: [x64] os: [freebsd] '@esbuild/linux-arm64@0.25.5': - resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==, + } + engines: { node: '>=18' } cpu: [arm64] os: [linux] '@esbuild/linux-arm@0.25.5': - resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==, + } + engines: { node: '>=18' } cpu: [arm] os: [linux] '@esbuild/linux-ia32@0.25.5': - resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==, + } + engines: { node: '>=18' } cpu: [ia32] os: [linux] '@esbuild/linux-loong64@0.25.5': - resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==, + } + engines: { node: '>=18' } cpu: [loong64] os: [linux] '@esbuild/linux-mips64el@0.25.5': - resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==, + } + engines: { node: '>=18' } cpu: [mips64el] os: [linux] '@esbuild/linux-ppc64@0.25.5': - resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==, + } + engines: { node: '>=18' } cpu: [ppc64] os: [linux] '@esbuild/linux-riscv64@0.25.5': - resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==, + } + engines: { node: '>=18' } cpu: [riscv64] os: [linux] '@esbuild/linux-s390x@0.25.5': - resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==, + } + engines: { node: '>=18' } cpu: [s390x] os: [linux] '@esbuild/linux-x64@0.25.5': - resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==, + } + engines: { node: '>=18' } cpu: [x64] os: [linux] '@esbuild/netbsd-arm64@0.25.5': - resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==, + } + engines: { node: '>=18' } cpu: [arm64] os: [netbsd] '@esbuild/netbsd-x64@0.25.5': - resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==, + } + engines: { node: '>=18' } cpu: [x64] os: [netbsd] '@esbuild/openbsd-arm64@0.25.5': - resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==, + } + engines: { node: '>=18' } cpu: [arm64] os: [openbsd] '@esbuild/openbsd-x64@0.25.5': - resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==, + } + engines: { node: '>=18' } cpu: [x64] os: [openbsd] '@esbuild/sunos-x64@0.25.5': - resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==, + } + engines: { node: '>=18' } cpu: [x64] os: [sunos] '@esbuild/win32-arm64@0.25.5': - resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==, + } + engines: { node: '>=18' } cpu: [arm64] os: [win32] '@esbuild/win32-ia32@0.25.5': - resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==, + } + engines: { node: '>=18' } cpu: [ia32] os: [win32] '@esbuild/win32-x64@0.25.5': - resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==, + } + engines: { node: '>=18' } cpu: [x64] os: [win32] '@eslint-community/eslint-utils@4.4.1': - resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 '@eslint-community/eslint-utils@4.7.0': - resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + resolution: + { + integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==, + } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } '@eslint/config-array@0.21.0': - resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@eslint/config-helpers@0.3.0': - resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@eslint/core@0.14.0': - resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@eslint/core@0.15.1': - resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@eslint/eslintrc@3.3.1': - resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@eslint/js@9.30.0': - resolution: {integrity: sha512-Wzw3wQwPvc9sHM+NjakWTcPx11mbZyiYHuwWa/QfZ7cIRX7WK54PSk7bdyXDaoaopUcMatv1zaQvOAAO8hCdww==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-Wzw3wQwPvc9sHM+NjakWTcPx11mbZyiYHuwWa/QfZ7cIRX7WK54PSk7bdyXDaoaopUcMatv1zaQvOAAO8hCdww==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@eslint/js@9.34.0': - resolution: {integrity: sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@eslint/object-schema@2.1.6': - resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@eslint/plugin-kit@0.3.3': - resolution: {integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} - engines: {node: '>=18.18.0'} + resolution: + { + integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==, + } + engines: { node: '>=18.18.0' } '@humanfs/node@0.16.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} - engines: {node: '>=18.18.0'} + resolution: + { + integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==, + } + engines: { node: '>=18.18.0' } '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} + resolution: + { + integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, + } + engines: { node: '>=12.22' } '@humanwhocodes/retry@0.3.1': - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} - engines: {node: '>=18.18'} + resolution: + { + integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==, + } + engines: { node: '>=18.18' } '@humanwhocodes/retry@0.4.3': - resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} - engines: {node: '>=18.18'} + resolution: + { + integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==, + } + engines: { node: '>=18.18' } '@inquirer/confirm@5.0.1': - resolution: {integrity: sha512-6ycMm7k7NUApiMGfVc32yIPp28iPKxhGRMqoNDiUjq2RyTAkbs5Fx0TdzBqhabcKvniDdAAvHCmsRjnNfTsogw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-6ycMm7k7NUApiMGfVc32yIPp28iPKxhGRMqoNDiUjq2RyTAkbs5Fx0TdzBqhabcKvniDdAAvHCmsRjnNfTsogw==, + } + engines: { node: '>=18' } peerDependencies: '@types/node': '>=18' '@inquirer/core@10.0.1': - resolution: {integrity: sha512-KKTgjViBQUi3AAssqjUFMnMO3CM3qwCHvePV9EW+zTKGKafFGFF01sc1yOIYjLJ7QU52G/FbzKc+c01WLzXmVQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-KKTgjViBQUi3AAssqjUFMnMO3CM3qwCHvePV9EW+zTKGKafFGFF01sc1yOIYjLJ7QU52G/FbzKc+c01WLzXmVQ==, + } + engines: { node: '>=18' } '@inquirer/figures@1.0.7': - resolution: {integrity: sha512-m+Trk77mp54Zma6xLkLuY+mvanPxlE4A7yNKs2HBiyZ4UkVs28Mv5c/pgWrHeInx+USHeX/WEPzjrWrcJiQgjw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-m+Trk77mp54Zma6xLkLuY+mvanPxlE4A7yNKs2HBiyZ4UkVs28Mv5c/pgWrHeInx+USHeX/WEPzjrWrcJiQgjw==, + } + engines: { node: '>=18' } '@inquirer/type@3.0.0': - resolution: {integrity: sha512-YYykfbw/lefC7yKj7nanzQXILM7r3suIvyFlCcMskc99axmsSewXWkAfXKwMbgxL76iAFVmRwmYdwNZNc8gjog==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-YYykfbw/lefC7yKj7nanzQXILM7r3suIvyFlCcMskc99axmsSewXWkAfXKwMbgxL76iAFVmRwmYdwNZNc8gjog==, + } + engines: { node: '>=18' } peerDependencies: '@types/node': '>=18' '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, + } + engines: { node: '>=12' } '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==, + } + engines: { node: '>=8' } '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==, + } + engines: { node: '>=6.0.0' } '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, + } + engines: { node: '>=6.0.0' } '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==, + } + engines: { node: '>=6.0.0' } '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + resolution: + { + integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==, + } '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + resolution: + { + integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==, + } '@mswjs/interceptors@0.39.2': - resolution: {integrity: sha512-RuzCup9Ct91Y7V79xwCb146RaBRHZ7NBbrIUySumd1rpKqHL5OonaqrGIbug5hNwP/fRyxFMA6ISgw4FTtYFYg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-RuzCup9Ct91Y7V79xwCb146RaBRHZ7NBbrIUySumd1rpKqHL5OonaqrGIbug5hNwP/fRyxFMA6ISgw4FTtYFYg==, + } + engines: { node: '>=18' } '@mui/core-downloads-tracker@7.2.0': - resolution: {integrity: sha512-d49s7kEgI5iX40xb2YPazANvo7Bx0BLg/MNRwv+7BVpZUzXj1DaVCKlQTDex3gy/0jsCb4w7AY2uH4t4AJvSog==} + resolution: + { + integrity: sha512-d49s7kEgI5iX40xb2YPazANvo7Bx0BLg/MNRwv+7BVpZUzXj1DaVCKlQTDex3gy/0jsCb4w7AY2uH4t4AJvSog==, + } '@mui/icons-material@7.2.0': - resolution: {integrity: sha512-gRCspp3pfjHQyTmSOmYw7kUQTd9Udpdan4R8EnZvqPeoAtHnPzkvjBrBqzKaoAbbBp5bGF7BcD18zZJh4nwu0A==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-gRCspp3pfjHQyTmSOmYw7kUQTd9Udpdan4R8EnZvqPeoAtHnPzkvjBrBqzKaoAbbBp5bGF7BcD18zZJh4nwu0A==, + } + engines: { node: '>=14.0.0' } peerDependencies: '@mui/material': ^7.2.0 '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -568,8 +854,11 @@ packages: optional: true '@mui/material@7.2.0': - resolution: {integrity: sha512-NTuyFNen5Z2QY+I242MDZzXnFIVIR6ERxo7vntFi9K1wCgSwvIl0HcAO2OOydKqqKApE6omRiYhpny1ZhGuH7Q==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-NTuyFNen5Z2QY+I242MDZzXnFIVIR6ERxo7vntFi9K1wCgSwvIl0HcAO2OOydKqqKApE6omRiYhpny1ZhGuH7Q==, + } + engines: { node: '>=14.0.0' } peerDependencies: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 @@ -588,8 +877,11 @@ packages: optional: true '@mui/private-theming@7.2.0': - resolution: {integrity: sha512-y6N1Yt3T5RMxVFnCh6+zeSWBuQdNDm5/UlM0EAYZzZR/1u+XKJWYQmbpx4e+F+1EpkYi3Nk8KhPiQDi83M3zIw==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-y6N1Yt3T5RMxVFnCh6+zeSWBuQdNDm5/UlM0EAYZzZR/1u+XKJWYQmbpx4e+F+1EpkYi3Nk8KhPiQDi83M3zIw==, + } + engines: { node: '>=14.0.0' } peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -598,8 +890,11 @@ packages: optional: true '@mui/styled-engine@7.2.0': - resolution: {integrity: sha512-yq08xynbrNYcB1nBcW9Fn8/h/iniM3ewRguGJXPIAbHvxEF7Pz95kbEEOAAhwzxMX4okhzvHmk0DFuC5ayvgIQ==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-yq08xynbrNYcB1nBcW9Fn8/h/iniM3ewRguGJXPIAbHvxEF7Pz95kbEEOAAhwzxMX4okhzvHmk0DFuC5ayvgIQ==, + } + engines: { node: '>=14.0.0' } peerDependencies: '@emotion/react': ^11.4.1 '@emotion/styled': ^11.3.0 @@ -611,8 +906,11 @@ packages: optional: true '@mui/system@7.2.0': - resolution: {integrity: sha512-PG7cm/WluU6RAs+gNND2R9vDwNh+ERWxPkqTaiXQJGIFAyJ+VxhyKfzpdZNk0z0XdmBxxi9KhFOpgxjehf/O0A==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-PG7cm/WluU6RAs+gNND2R9vDwNh+ERWxPkqTaiXQJGIFAyJ+VxhyKfzpdZNk0z0XdmBxxi9KhFOpgxjehf/O0A==, + } + engines: { node: '>=14.0.0' } peerDependencies: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 @@ -627,7 +925,10 @@ packages: optional: true '@mui/types@7.4.4': - resolution: {integrity: sha512-p63yhbX52MO/ajXC7hDHJA5yjzJekvWD3q4YDLl1rSg+OXLczMYPvTuSuviPRCgRX8+E42RXz1D/dz9SxPSlWg==} + resolution: + { + integrity: sha512-p63yhbX52MO/ajXC7hDHJA5yjzJekvWD3q4YDLl1rSg+OXLczMYPvTuSuviPRCgRX8+E42RXz1D/dz9SxPSlWg==, + } peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: @@ -635,8 +936,11 @@ packages: optional: true '@mui/utils@7.2.0': - resolution: {integrity: sha512-O0i1GQL6MDzhKdy9iAu5Yr0Sz1wZjROH1o3aoztuivdCXqEeQYnEjTDiRLGuFxI9zrUbTHBwobMyQH5sNtyacw==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-O0i1GQL6MDzhKdy9iAu5Yr0Sz1wZjROH1o3aoztuivdCXqEeQYnEjTDiRLGuFxI9zrUbTHBwobMyQH5sNtyacw==, + } + engines: { node: '>=14.0.0' } peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -645,213 +949,345 @@ packages: optional: true '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: '>= 8' } '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + } + engines: { node: '>= 8' } '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: '>= 8' } '@open-draft/deferred-promise@2.2.0': - resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + resolution: + { + integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==, + } '@open-draft/logger@0.3.0': - resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} + resolution: + { + integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==, + } '@open-draft/until@2.1.0': - resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + resolution: + { + integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==, + } '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, + } + engines: { node: '>=14' } '@pkgr/core@0.2.7': - resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + resolution: + { + integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==, + } + engines: { node: ^12.20.0 || ^14.18.0 || >=16.0.0 } '@polka/url@1.0.0-next.28': - resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} + resolution: + { + integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==, + } '@popperjs/core@2.11.8': - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + resolution: + { + integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==, + } '@rollup/pluginutils@4.2.1': - resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} - engines: {node: '>= 8.0.0'} + resolution: + { + integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==, + } + engines: { node: '>= 8.0.0' } '@rollup/rollup-android-arm-eabi@4.44.1': - resolution: {integrity: sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==} + resolution: + { + integrity: sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==, + } cpu: [arm] os: [android] '@rollup/rollup-android-arm64@4.44.1': - resolution: {integrity: sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==} + resolution: + { + integrity: sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==, + } cpu: [arm64] os: [android] '@rollup/rollup-darwin-arm64@4.44.1': - resolution: {integrity: sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==} + resolution: + { + integrity: sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==, + } cpu: [arm64] os: [darwin] '@rollup/rollup-darwin-x64@4.44.1': - resolution: {integrity: sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==} + resolution: + { + integrity: sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==, + } cpu: [x64] os: [darwin] '@rollup/rollup-freebsd-arm64@4.44.1': - resolution: {integrity: sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==} + resolution: + { + integrity: sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==, + } cpu: [arm64] os: [freebsd] '@rollup/rollup-freebsd-x64@4.44.1': - resolution: {integrity: sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==} + resolution: + { + integrity: sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==, + } cpu: [x64] os: [freebsd] '@rollup/rollup-linux-arm-gnueabihf@4.44.1': - resolution: {integrity: sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==} + resolution: + { + integrity: sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==, + } cpu: [arm] os: [linux] '@rollup/rollup-linux-arm-musleabihf@4.44.1': - resolution: {integrity: sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==} + resolution: + { + integrity: sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==, + } cpu: [arm] os: [linux] '@rollup/rollup-linux-arm64-gnu@4.44.1': - resolution: {integrity: sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==} + resolution: + { + integrity: sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==, + } cpu: [arm64] os: [linux] '@rollup/rollup-linux-arm64-musl@4.44.1': - resolution: {integrity: sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==} + resolution: + { + integrity: sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==, + } cpu: [arm64] os: [linux] '@rollup/rollup-linux-loongarch64-gnu@4.44.1': - resolution: {integrity: sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==} + resolution: + { + integrity: sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==, + } cpu: [loong64] os: [linux] '@rollup/rollup-linux-powerpc64le-gnu@4.44.1': - resolution: {integrity: sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==} + resolution: + { + integrity: sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==, + } cpu: [ppc64] os: [linux] '@rollup/rollup-linux-riscv64-gnu@4.44.1': - resolution: {integrity: sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==} + resolution: + { + integrity: sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==, + } cpu: [riscv64] os: [linux] '@rollup/rollup-linux-riscv64-musl@4.44.1': - resolution: {integrity: sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==} + resolution: + { + integrity: sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==, + } cpu: [riscv64] os: [linux] '@rollup/rollup-linux-s390x-gnu@4.44.1': - resolution: {integrity: sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==} + resolution: + { + integrity: sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==, + } cpu: [s390x] os: [linux] '@rollup/rollup-linux-x64-gnu@4.44.1': - resolution: {integrity: sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==} + resolution: + { + integrity: sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==, + } cpu: [x64] os: [linux] '@rollup/rollup-linux-x64-musl@4.44.1': - resolution: {integrity: sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==} + resolution: + { + integrity: sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==, + } cpu: [x64] os: [linux] '@rollup/rollup-win32-arm64-msvc@4.44.1': - resolution: {integrity: sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==} + resolution: + { + integrity: sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==, + } cpu: [arm64] os: [win32] '@rollup/rollup-win32-ia32-msvc@4.44.1': - resolution: {integrity: sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==} + resolution: + { + integrity: sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==, + } cpu: [ia32] os: [win32] '@rollup/rollup-win32-x64-msvc@4.44.1': - resolution: {integrity: sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==} + resolution: + { + integrity: sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==, + } cpu: [x64] os: [win32] '@rtsao/scc@1.1.0': - resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + resolution: + { + integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==, + } '@storybook/global@5.0.0': - resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} + resolution: + { + integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==, + } '@swc/core-darwin-arm64@1.7.40': - resolution: {integrity: sha512-LRRrCiRJLb1kpQtxMNNsr5W82Inr0dy5Imho+4HQzVx/Ismi0qX4hQBgzJAnyOBNLK1+OBVb/912UVhKXppdfQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-LRRrCiRJLb1kpQtxMNNsr5W82Inr0dy5Imho+4HQzVx/Ismi0qX4hQBgzJAnyOBNLK1+OBVb/912UVhKXppdfQ==, + } + engines: { node: '>=10' } cpu: [arm64] os: [darwin] '@swc/core-darwin-x64@1.7.40': - resolution: {integrity: sha512-Lpl0XK/4fLzS5jsK48opUuGXrqJXwqJckYYPwyGbCfCXm4MsBe+7dX2hq/Kc4YMY25+NeTmzAXhla8TT4WYD/g==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-Lpl0XK/4fLzS5jsK48opUuGXrqJXwqJckYYPwyGbCfCXm4MsBe+7dX2hq/Kc4YMY25+NeTmzAXhla8TT4WYD/g==, + } + engines: { node: '>=10' } cpu: [x64] os: [darwin] '@swc/core-linux-arm-gnueabihf@1.7.40': - resolution: {integrity: sha512-4bEvvjptpoc5BRPr/R419h6fXTEuub+frpxxlxBOEKxgXjAF/S3xdxyPijUAakmW/xXBF0u7OC4KYI+38yQp6g==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-4bEvvjptpoc5BRPr/R419h6fXTEuub+frpxxlxBOEKxgXjAF/S3xdxyPijUAakmW/xXBF0u7OC4KYI+38yQp6g==, + } + engines: { node: '>=10' } cpu: [arm] os: [linux] '@swc/core-linux-arm64-gnu@1.7.40': - resolution: {integrity: sha512-v2fBlHJ/6Ovz0L2xFAI9TRiKyl9DTdx139PuAHD9gyzp16Utl/W0MPd4t2cYdkI6hPXE9PsJCSzMOrduh+YoDg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-v2fBlHJ/6Ovz0L2xFAI9TRiKyl9DTdx139PuAHD9gyzp16Utl/W0MPd4t2cYdkI6hPXE9PsJCSzMOrduh+YoDg==, + } + engines: { node: '>=10' } cpu: [arm64] os: [linux] '@swc/core-linux-arm64-musl@1.7.40': - resolution: {integrity: sha512-uMkduQuU4LFVkW6txv8AVArT8GjJVJ5IHoWloXaUBMT447iE8NALmpePdZWhMyj6KV7j0y23CM5rzV/I2eNGLg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-uMkduQuU4LFVkW6txv8AVArT8GjJVJ5IHoWloXaUBMT447iE8NALmpePdZWhMyj6KV7j0y23CM5rzV/I2eNGLg==, + } + engines: { node: '>=10' } cpu: [arm64] os: [linux] '@swc/core-linux-x64-gnu@1.7.40': - resolution: {integrity: sha512-4LZdY1MBSnXyTpW5fpBU/+JGAhkuHT+VnFTDNegRboN5nSPh7y0Yvn4LmIioESV+sWzjKkEXujJPGjrp+oSp5w==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-4LZdY1MBSnXyTpW5fpBU/+JGAhkuHT+VnFTDNegRboN5nSPh7y0Yvn4LmIioESV+sWzjKkEXujJPGjrp+oSp5w==, + } + engines: { node: '>=10' } cpu: [x64] os: [linux] '@swc/core-linux-x64-musl@1.7.40': - resolution: {integrity: sha512-FPjOwT3SgI6PAwH1O8bhOGBPzuvzOlzKeCtxLaCjruHJu9V8KKBrMTWOZT/FJyYC9mX5Ip1+l9j30UqUZdQxtA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-FPjOwT3SgI6PAwH1O8bhOGBPzuvzOlzKeCtxLaCjruHJu9V8KKBrMTWOZT/FJyYC9mX5Ip1+l9j30UqUZdQxtA==, + } + engines: { node: '>=10' } cpu: [x64] os: [linux] '@swc/core-win32-arm64-msvc@1.7.40': - resolution: {integrity: sha512-//ovXdD9GsTmhPmXJlXnIbRQkeuL6PSrYSr7uCMNcclrUdJG0YkO0GMM2afUKYbdJcunylDDWsSS8PFWn0QxmA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-//ovXdD9GsTmhPmXJlXnIbRQkeuL6PSrYSr7uCMNcclrUdJG0YkO0GMM2afUKYbdJcunylDDWsSS8PFWn0QxmA==, + } + engines: { node: '>=10' } cpu: [arm64] os: [win32] '@swc/core-win32-ia32-msvc@1.7.40': - resolution: {integrity: sha512-iD/1auVhHGlhWAPrWmfRWL3w4AvXIWGVXZiSA109/xnRIPiHKb/HqqTp/qB94E/ZHMPRgLKkLTNwamlkueUs8g==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-iD/1auVhHGlhWAPrWmfRWL3w4AvXIWGVXZiSA109/xnRIPiHKb/HqqTp/qB94E/ZHMPRgLKkLTNwamlkueUs8g==, + } + engines: { node: '>=10' } cpu: [ia32] os: [win32] '@swc/core-win32-x64-msvc@1.7.40': - resolution: {integrity: sha512-ZlFAV1WFPhhWQ/8esiygmetkb905XIcMMtHRRG0FBGCllO+HVL5nikUaLDgTClz1onmEY9sMXUFQeoPtvliV+w==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-ZlFAV1WFPhhWQ/8esiygmetkb905XIcMMtHRRG0FBGCllO+HVL5nikUaLDgTClz1onmEY9sMXUFQeoPtvliV+w==, + } + engines: { node: '>=10' } cpu: [x64] os: [win32] '@swc/core@1.7.40': - resolution: {integrity: sha512-0HIzM5vigVT5IvNum+pPuST9p8xFhN6mhdIKju7qYYeNuZG78lwms/2d8WgjTJJlzp6JlPguXGrMMNzjQw0qNg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-0HIzM5vigVT5IvNum+pPuST9p8xFhN6mhdIKju7qYYeNuZG78lwms/2d8WgjTJJlzp6JlPguXGrMMNzjQw0qNg==, + } + engines: { node: '>=10' } peerDependencies: '@swc/helpers': '*' peerDependenciesMeta: @@ -859,22 +1295,37 @@ packages: optional: true '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + resolution: + { + integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==, + } '@swc/types@0.1.13': - resolution: {integrity: sha512-JL7eeCk6zWCbiYQg2xQSdLXQJl8Qoc9rXmG2cEKvHe3CKwMHwHGpfOb8frzNLmbycOo6I51qxnLnn9ESf4I20Q==} + resolution: + { + integrity: sha512-JL7eeCk6zWCbiYQg2xQSdLXQJl8Qoc9rXmG2cEKvHe3CKwMHwHGpfOb8frzNLmbycOo6I51qxnLnn9ESf4I20Q==, + } '@testing-library/dom@10.4.0': - resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==, + } + engines: { node: '>=18' } '@testing-library/jest-dom@6.6.3': - resolution: {integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==} - engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + resolution: + { + integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==, + } + engines: { node: '>=14', npm: '>=6', yarn: '>=1' } '@testing-library/react@16.3.0': - resolution: {integrity: sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==, + } + engines: { node: '>=18' } peerDependencies: '@testing-library/dom': ^10.0.0 '@types/react': ^18.0.0 || ^19.0.0 @@ -888,125 +1339,212 @@ packages: optional: true '@testing-library/user-event@14.5.2': - resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} - engines: {node: '>=12', npm: '>=6'} + resolution: + { + integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==, + } + engines: { node: '>=12', npm: '>=6' } peerDependencies: '@testing-library/dom': '>=7.21.4' '@testing-library/user-event@14.6.1': - resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} - engines: {node: '>=12', npm: '>=6'} + resolution: + { + integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==, + } + engines: { node: '>=12', npm: '>=6' } peerDependencies: '@testing-library/dom': '>=7.21.4' '@types/aria-query@5.0.4': - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + resolution: + { + integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==, + } '@types/chai@5.2.2': - resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + resolution: + { + integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==, + } '@types/cookie@0.6.0': - resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + resolution: + { + integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==, + } '@types/deep-eql@4.0.2': - resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + resolution: + { + integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==, + } '@types/eslint@8.56.12': - resolution: {integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==} + resolution: + { + integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==, + } '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + resolution: + { + integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==, + } '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + resolution: + { + integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==, + } '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + resolution: + { + integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, + } '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + resolution: + { + integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==, + } '@types/node@22.18.8': - resolution: {integrity: sha512-pAZSHMiagDR7cARo/cch1f3rXy0AEXwsVsVH09FcyeJVAzCnGgmYis7P3JidtTUjyadhTeSo8TgRPswstghDaw==} + resolution: + { + integrity: sha512-pAZSHMiagDR7cARo/cch1f3rXy0AEXwsVsVH09FcyeJVAzCnGgmYis7P3JidtTUjyadhTeSo8TgRPswstghDaw==, + } '@types/parse-json@4.0.2': - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + resolution: + { + integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==, + } '@types/prop-types@15.7.15': - resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + resolution: + { + integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==, + } '@types/react-dom@19.1.6': - resolution: {integrity: sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==} + resolution: + { + integrity: sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==, + } peerDependencies: '@types/react': ^19.0.0 '@types/react-transition-group@4.4.12': - resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==} + resolution: + { + integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==, + } peerDependencies: '@types/react': '*' '@types/react@19.1.8': - resolution: {integrity: sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==} + resolution: + { + integrity: sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==, + } '@types/statuses@2.0.5': - resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==} + resolution: + { + integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==, + } '@types/tough-cookie@4.0.5': - resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + resolution: + { + integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==, + } '@typescript-eslint/eslint-plugin@8.35.0': - resolution: {integrity: sha512-ijItUYaiWuce0N1SoSMrEd0b6b6lYkYt99pqCPfybd+HKVXtEvYhICfLdwp42MhiI5mp0oq7PKEL+g1cNiz/Eg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-ijItUYaiWuce0N1SoSMrEd0b6b6lYkYt99pqCPfybd+HKVXtEvYhICfLdwp42MhiI5mp0oq7PKEL+g1cNiz/Eg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: '@typescript-eslint/parser': ^8.35.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/parser@8.35.0': - resolution: {integrity: sha512-6sMvZePQrnZH2/cJkwRpkT7DxoAWh+g6+GFRK6bV3YQo7ogi3SX5rgF6099r5Q53Ma5qeT7LGmOmuIutF4t3lA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-6sMvZePQrnZH2/cJkwRpkT7DxoAWh+g6+GFRK6bV3YQo7ogi3SX5rgF6099r5Q53Ma5qeT7LGmOmuIutF4t3lA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/project-service@8.35.0': - resolution: {integrity: sha512-41xatqRwWZuhUMF/aZm2fcUsOFKNcG28xqRSS6ZVr9BVJtGExosLAm5A1OxTjRMagx8nJqva+P5zNIGt8RIgbQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-41xatqRwWZuhUMF/aZm2fcUsOFKNcG28xqRSS6ZVr9BVJtGExosLAm5A1OxTjRMagx8nJqva+P5zNIGt8RIgbQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/scope-manager@7.18.0': - resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} - engines: {node: ^18.18.0 || >=20.0.0} + resolution: + { + integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==, + } + engines: { node: ^18.18.0 || >=20.0.0 } '@typescript-eslint/scope-manager@8.35.0': - resolution: {integrity: sha512-+AgL5+mcoLxl1vGjwNfiWq5fLDZM1TmTPYs2UkyHfFhgERxBbqHlNjRzhThJqz+ktBqTChRYY6zwbMwy0591AA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-+AgL5+mcoLxl1vGjwNfiWq5fLDZM1TmTPYs2UkyHfFhgERxBbqHlNjRzhThJqz+ktBqTChRYY6zwbMwy0591AA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@typescript-eslint/tsconfig-utils@8.35.0': - resolution: {integrity: sha512-04k/7247kZzFraweuEirmvUj+W3bJLI9fX6fbo1Qm2YykuBvEhRTPl8tcxlYO8kZZW+HIXfkZNoasVb8EV4jpA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-04k/7247kZzFraweuEirmvUj+W3bJLI9fX6fbo1Qm2YykuBvEhRTPl8tcxlYO8kZZW+HIXfkZNoasVb8EV4jpA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/type-utils@8.35.0': - resolution: {integrity: sha512-ceNNttjfmSEoM9PW87bWLDEIaLAyR+E6BoYJQ5PfaDau37UGca9Nyq3lBk8Bw2ad0AKvYabz6wxc7DMTO2jnNA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-ceNNttjfmSEoM9PW87bWLDEIaLAyR+E6BoYJQ5PfaDau37UGca9Nyq3lBk8Bw2ad0AKvYabz6wxc7DMTO2jnNA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/types@7.18.0': - resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} - engines: {node: ^18.18.0 || >=20.0.0} + resolution: + { + integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==, + } + engines: { node: ^18.18.0 || >=20.0.0 } '@typescript-eslint/types@8.35.0': - resolution: {integrity: sha512-0mYH3emanku0vHw2aRLNGqe7EXh9WHEhi7kZzscrMDf6IIRUQ5Jk4wp1QrledE/36KtdZrVfKnE32eZCf/vaVQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-0mYH3emanku0vHw2aRLNGqe7EXh9WHEhi7kZzscrMDf6IIRUQ5Jk4wp1QrledE/36KtdZrVfKnE32eZCf/vaVQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@typescript-eslint/typescript-estree@7.18.0': - resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} - engines: {node: ^18.18.0 || >=20.0.0} + resolution: + { + integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==, + } + engines: { node: ^18.18.0 || >=20.0.0 } peerDependencies: typescript: '*' peerDependenciesMeta: @@ -1014,39 +1552,60 @@ packages: optional: true '@typescript-eslint/typescript-estree@8.35.0': - resolution: {integrity: sha512-F+BhnaBemgu1Qf8oHrxyw14wq6vbL8xwWKKMwTMwYIRmFFY/1n/9T/jpbobZL8vp7QyEUcC6xGrnAO4ua8Kp7w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-F+BhnaBemgu1Qf8oHrxyw14wq6vbL8xwWKKMwTMwYIRmFFY/1n/9T/jpbobZL8vp7QyEUcC6xGrnAO4ua8Kp7w==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/utils@7.18.0': - resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} - engines: {node: ^18.18.0 || >=20.0.0} + resolution: + { + integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==, + } + engines: { node: ^18.18.0 || >=20.0.0 } peerDependencies: eslint: ^8.56.0 '@typescript-eslint/utils@8.35.0': - resolution: {integrity: sha512-nqoMu7WWM7ki5tPgLVsmPM8CkqtoPUG6xXGeefM5t4x3XumOEKMoUZPdi+7F+/EotukN4R9OWdmDxN80fqoZeg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-nqoMu7WWM7ki5tPgLVsmPM8CkqtoPUG6xXGeefM5t4x3XumOEKMoUZPdi+7F+/EotukN4R9OWdmDxN80fqoZeg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/visitor-keys@7.18.0': - resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} - engines: {node: ^18.18.0 || >=20.0.0} + resolution: + { + integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==, + } + engines: { node: ^18.18.0 || >=20.0.0 } '@typescript-eslint/visitor-keys@8.35.0': - resolution: {integrity: sha512-zTh2+1Y8ZpmeQaQVIc/ZZxsx8UzgKJyNg1PTvjzC7WMhPSVS8bfDX34k1SrwOf016qd5RU3az2UxUNue3IfQ5g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-zTh2+1Y8ZpmeQaQVIc/ZZxsx8UzgKJyNg1PTvjzC7WMhPSVS8bfDX34k1SrwOf016qd5RU3az2UxUNue3IfQ5g==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@vitejs/plugin-react-swc@3.7.1': - resolution: {integrity: sha512-vgWOY0i1EROUK0Ctg1hwhtC3SdcDjZcdit4Ups4aPkDcB1jYhmo+RMYWY87cmXMhvtD5uf8lV89j2w16vkdSVg==} + resolution: + { + integrity: sha512-vgWOY0i1EROUK0Ctg1hwhtC3SdcDjZcdit4Ups4aPkDcB1jYhmo+RMYWY87cmXMhvtD5uf8lV89j2w16vkdSVg==, + } peerDependencies: vite: ^4 || ^5 '@vitest/coverage-v8@2.1.3': - resolution: {integrity: sha512-2OJ3c7UPoFSmBZwqD2VEkUw6A/tzPF0LmW0ZZhhB8PFxuc+9IBG/FaSM+RLEenc7ljzFvGN+G0nGQoZnh7sy2A==} + resolution: + { + integrity: sha512-2OJ3c7UPoFSmBZwqD2VEkUw6A/tzPF0LmW0ZZhhB8PFxuc+9IBG/FaSM+RLEenc7ljzFvGN+G0nGQoZnh7sy2A==, + } peerDependencies: '@vitest/browser': 2.1.3 vitest: 2.1.3 @@ -1055,10 +1614,16 @@ packages: optional: true '@vitest/expect@3.2.4': - resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + resolution: + { + integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==, + } '@vitest/mocker@3.2.4': - resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + resolution: + { + integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==, + } peerDependencies: msw: ^2.4.9 vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 @@ -1069,321 +1634,570 @@ packages: optional: true '@vitest/pretty-format@3.2.4': - resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + resolution: + { + integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==, + } '@vitest/runner@3.2.4': - resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + resolution: + { + integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==, + } '@vitest/snapshot@3.2.4': - resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + resolution: + { + integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==, + } '@vitest/spy@3.2.4': - resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + resolution: + { + integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==, + } '@vitest/ui@3.2.4': - resolution: {integrity: sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA==} + resolution: + { + integrity: sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA==, + } peerDependencies: vitest: 3.2.4 '@vitest/utils@3.2.4': - resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + resolution: + { + integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==, + } accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==, + } + engines: { node: '>= 0.6' } acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + } peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} - engines: {node: '>=0.4.0'} + resolution: + { + integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==, + } + engines: { node: '>=0.4.0' } hasBin: true agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} - engines: {node: '>= 14'} + resolution: + { + integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==, + } + engines: { node: '>= 14' } agent-base@7.1.3: - resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} - engines: {node: '>= 14'} + resolution: + { + integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==, + } + engines: { node: '>= 14' } ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + resolution: + { + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + } ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, + } + engines: { node: '>=8' } ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: '>=8' } ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==, + } + engines: { node: '>=12' } ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: '>=8' } ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, + } + engines: { node: '>=10' } ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, + } + engines: { node: '>=12' } argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + resolution: + { + integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==, + } aria-query@5.3.2: - resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==, + } + engines: { node: '>= 0.4' } array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==, + } + engines: { node: '>= 0.4' } array-buffer-byte-length@1.0.2: - resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==, + } + engines: { node: '>= 0.4' } array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + resolution: + { + integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==, + } array-includes@3.1.9: - resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==, + } + engines: { node: '>= 0.4' } array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, + } + engines: { node: '>=8' } array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==, + } + engines: { node: '>= 0.4' } array.prototype.findlastindex@1.2.6: - resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==, + } + engines: { node: '>= 0.4' } array.prototype.flat@1.3.3: - resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==, + } + engines: { node: '>= 0.4' } array.prototype.flatmap@1.3.3: - resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==, + } + engines: { node: '>= 0.4' } array.prototype.tosorted@1.1.4: - resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==, + } + engines: { node: '>= 0.4' } arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==, + } + engines: { node: '>= 0.4' } arraybuffer.prototype.slice@1.0.4: - resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==, + } + engines: { node: '>= 0.4' } assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==, + } + engines: { node: '>=12' } ast-types@0.16.1: - resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==, + } + engines: { node: '>=4' } available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==, + } + engines: { node: '>= 0.4' } babel-plugin-macros@3.1.0: - resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} - engines: {node: '>=10', npm: '>=6'} + resolution: + { + integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==, + } + engines: { node: '>=10', npm: '>=6' } balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } better-opn@3.0.2: - resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==, + } + engines: { node: '>=12.0.0' } body-parser@1.20.3: - resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + resolution: + { + integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==, + } + engines: { node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16 } brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + resolution: + { + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, + } brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + resolution: + { + integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, + } braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, + } + engines: { node: '>=8' } bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, + } + engines: { node: '>= 0.8' } cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==, + } + engines: { node: '>=8' } call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==, + } + engines: { node: '>= 0.4' } call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==, + } + engines: { node: '>= 0.4' } call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==, + } + engines: { node: '>= 0.4' } call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==, + } + engines: { node: '>= 0.4' } callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, + } + engines: { node: '>=6' } chai@5.2.0: - resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==, + } + engines: { node: '>=12' } chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==, + } + engines: { node: '>=8' } chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: '>=10' } check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} - engines: {node: '>= 16'} + resolution: + { + integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==, + } + engines: { node: '>= 16' } cli-width@4.1.0: - resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} - engines: {node: '>= 12'} + resolution: + { + integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==, + } + engines: { node: '>= 12' } cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, + } + engines: { node: '>=12' } clsx@1.2.1: - resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==, + } + engines: { node: '>=6' } clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==, + } + engines: { node: '>=6' } color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: '>=7.0.0' } color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } concurrently@8.2.2: - resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} - engines: {node: ^14.13.0 || >=16.0.0} + resolution: + { + integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==, + } + engines: { node: ^14.13.0 || >=16.0.0 } hasBin: true content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==, + } + engines: { node: '>= 0.6' } content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, + } + engines: { node: '>= 0.6' } convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + resolution: + { + integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==, + } cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + resolution: + { + integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==, + } cookie@0.7.1: - resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==, + } + engines: { node: '>= 0.6' } cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==, + } + engines: { node: '>= 0.6' } cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==, + } + engines: { node: '>=10' } cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, + } + engines: { node: '>= 8' } cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==, + } + engines: { node: '>= 8' } css.escape@1.5.1: - resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + resolution: + { + integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==, + } cssstyle@4.6.0: - resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==, + } + engines: { node: '>=18' } csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + resolution: + { + integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==, + } data-urls@5.0.0: - resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==, + } + engines: { node: '>=18' } data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==, + } + engines: { node: '>= 0.4' } data-view-buffer@1.0.2: - resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==, + } + engines: { node: '>= 0.4' } data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==, + } + engines: { node: '>= 0.4' } data-view-byte-length@1.0.2: - resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==, + } + engines: { node: '>= 0.4' } data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==, + } + engines: { node: '>= 0.4' } data-view-byte-offset@1.0.1: - resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==, + } + engines: { node: '>= 0.4' } date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} + resolution: + { + integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==, + } + engines: { node: '>=0.11' } debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + resolution: + { + integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==, + } peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -1391,7 +2205,10 @@ packages: optional: true debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + resolution: + { + integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==, + } peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -1399,8 +2216,11 @@ packages: optional: true debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} - engines: {node: '>=6.0'} + resolution: + { + integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==, + } + engines: { node: '>=6.0' } peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -1408,8 +2228,11 @@ packages: optional: true debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} - engines: {node: '>=6.0'} + resolution: + { + integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==, + } + engines: { node: '>=6.0' } peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -1417,178 +2240,316 @@ packages: optional: true decimal.js@10.5.0: - resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} + resolution: + { + integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==, + } deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==, + } + engines: { node: '>=6' } deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + resolution: + { + integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, + } define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==, + } + engines: { node: '>= 0.4' } define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==, + } + engines: { node: '>=8' } define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==, + } + engines: { node: '>= 0.4' } depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, + } + engines: { node: '>= 0.8' } dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==, + } + engines: { node: '>=6' } destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + resolution: + { + integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==, + } + engines: { node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16 } dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, + } + engines: { node: '>=8' } doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==, + } + engines: { node: '>=0.10.0' } dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + resolution: + { + integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==, + } dom-accessibility-api@0.6.3: - resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + resolution: + { + integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==, + } dom-helpers@5.2.1: - resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + resolution: + { + integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==, + } dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==, + } + engines: { node: '>= 0.4' } eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + resolution: + { + integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, + } ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + resolution: + { + integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, + } emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + resolution: + { + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, + } emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + resolution: + { + integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, + } encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==, + } + engines: { node: '>= 0.8' } encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==, + } + engines: { node: '>= 0.8' } entities@6.0.1: - resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} - engines: {node: '>=0.12'} + resolution: + { + integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==, + } + engines: { node: '>=0.12' } error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + resolution: + { + integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, + } es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==, + } + engines: { node: '>= 0.4' } es-abstract@1.24.0: - resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==, + } + engines: { node: '>= 0.4' } es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==, + } + engines: { node: '>= 0.4' } es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==, + } + engines: { node: '>= 0.4' } es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, + } + engines: { node: '>= 0.4' } es-iterator-helpers@1.1.0: - resolution: {integrity: sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw==, + } + engines: { node: '>= 0.4' } es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + resolution: + { + integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==, + } es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==, + } + engines: { node: '>= 0.4' } es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==, + } + engines: { node: '>= 0.4' } es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==, + } + engines: { node: '>= 0.4' } es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==, + } + engines: { node: '>= 0.4' } es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + resolution: + { + integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==, + } es-shim-unscopables@1.1.0: - resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==, + } + engines: { node: '>= 0.4' } es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==, + } + engines: { node: '>= 0.4' } es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==, + } + engines: { node: '>= 0.4' } esbuild-register@3.6.0: - resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} + resolution: + { + integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==, + } peerDependencies: esbuild: '>=0.12 <1' esbuild@0.25.5: - resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==, + } + engines: { node: '>=18' } hasBin: true escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, + } + engines: { node: '>=6' } escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + resolution: + { + integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, + } escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, + } + engines: { node: '>=10' } eslint-config-prettier@10.1.5: - resolution: {integrity: sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==} + resolution: + { + integrity: sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==, + } hasBin: true peerDependencies: eslint: '>=7.0.0' eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + resolution: + { + integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==, + } eslint-module-utils@2.12.1: - resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==, + } + engines: { node: '>=4' } peerDependencies: '@typescript-eslint/parser': '*' eslint: '*' @@ -1608,8 +2569,11 @@ packages: optional: true eslint-plugin-import@2.32.0: - resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==, + } + engines: { node: '>=4' } peerDependencies: '@typescript-eslint/parser': '*' eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 @@ -1618,8 +2582,11 @@ packages: optional: true eslint-plugin-prettier@5.5.1: - resolution: {integrity: sha512-dobTkHT6XaEVOo8IO90Q4DOSxnm3Y151QxPJlM/vKC0bVy+d6cVWQZLlFiuZPP0wS6vZwSKeJgKkcS+KfMBlRw==} - engines: {node: ^14.18.0 || >=16.0.0} + resolution: + { + integrity: sha512-dobTkHT6XaEVOo8IO90Q4DOSxnm3Y151QxPJlM/vKC0bVy+d6cVWQZLlFiuZPP0wS6vZwSKeJgKkcS+KfMBlRw==, + } + engines: { node: ^14.18.0 || >=16.0.0 } peerDependencies: '@types/eslint': '>=8.0.0' eslint: '>=8.0.0' @@ -1632,27 +2599,39 @@ packages: optional: true eslint-plugin-react-hooks@5.2.0: - resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==, + } + engines: { node: '>=10' } peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 eslint-plugin-react@7.37.2: - resolution: {integrity: sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==, + } + engines: { node: '>=4' } peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 eslint-plugin-storybook@9.0.14: - resolution: {integrity: sha512-YZsDhyFgVfeFPdvd7Xcl9ZusY7Jniq7AOAWN/cdg0a2Y+ywKKNYrQ+EfyuhXsiMjh58plYKMpJYxKVxeUwW9jw==} - engines: {node: '>=20.0.0'} + resolution: + { + integrity: sha512-YZsDhyFgVfeFPdvd7Xcl9ZusY7Jniq7AOAWN/cdg0a2Y+ywKKNYrQ+EfyuhXsiMjh58plYKMpJYxKVxeUwW9jw==, + } + engines: { node: '>=20.0.0' } peerDependencies: eslint: '>=8' storybook: ^9.0.14 eslint-plugin-vitest@0.5.4: - resolution: {integrity: sha512-um+odCkccAHU53WdKAw39MY61+1x990uXjSPguUCq3VcEHdqJrOb8OTMrbYlY6f9jAKx7x98kLVlIe3RJeJqoQ==} - engines: {node: ^18.0.0 || >= 20.0.0} + resolution: + { + integrity: sha512-um+odCkccAHU53WdKAw39MY61+1x990uXjSPguUCq3VcEHdqJrOb8OTMrbYlY6f9jAKx7x98kLVlIe3RJeJqoQ==, + } + engines: { node: ^18.0.0 || >= 20.0.0 } peerDependencies: '@typescript-eslint/eslint-plugin': '*' eslint: ^8.57.0 || ^9.0.0 @@ -1664,20 +2643,32 @@ packages: optional: true eslint-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } eslint-visitor-keys@4.2.1: - resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } eslint@9.30.0: - resolution: {integrity: sha512-iN/SiPxmQu6EVkf+m1qpBxzUhE12YqFLOSySuOyVLJLEF9nzTf+h/1AJYc1JWzCnktggeNrjvQGLngDzXirU6g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-iN/SiPxmQu6EVkf+m1qpBxzUhE12YqFLOSySuOyVLJLEF9nzTf+h/1AJYc1JWzCnktggeNrjvQGLngDzXirU6g==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } hasBin: true peerDependencies: jiti: '*' @@ -1686,69 +2677,123 @@ packages: optional: true espree@10.4.0: - resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { + integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, + } + engines: { node: '>=4' } hasBin: true esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} + resolution: + { + integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==, + } + engines: { node: '>=0.10' } esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, + } + engines: { node: '>=4.0' } estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, + } + engines: { node: '>=4.0' } estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + resolution: + { + integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==, + } estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + resolution: + { + integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==, + } esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, + } + engines: { node: '>=0.10.0' } etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==, + } + engines: { node: '>= 0.6' } expect-type@1.2.1: - resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==, + } + engines: { node: '>=12.0.0' } express@4.21.1: - resolution: {integrity: sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==} - engines: {node: '>= 0.10.0'} + resolution: + { + integrity: sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==, + } + engines: { node: '>= 0.10.0' } fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + resolution: + { + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + } fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + resolution: + { + integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==, + } fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + resolution: + { + integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, + } + engines: { node: '>=8.6.0' } fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + resolution: + { + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + } fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + resolution: + { + integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, + } fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + resolution: + { + integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==, + } fdir@6.4.6: - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + resolution: + { + integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==, + } peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -1756,54 +2801,96 @@ packages: optional: true fflate@0.8.2: - resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + resolution: + { + integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==, + } file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} + resolution: + { + integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==, + } + engines: { node: '>=16.0.0' } fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, + } + engines: { node: '>=8' } finalhandler@1.3.1: - resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==, + } + engines: { node: '>= 0.8' } find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + resolution: + { + integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==, + } find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, + } + engines: { node: '>=10' } flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==, + } + engines: { node: '>=16' } flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + resolution: + { + integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==, + } flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + resolution: + { + integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==, + } for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + resolution: + { + integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==, + } for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==, + } + engines: { node: '>= 0.4' } foreground-child@3.3.0: - resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==, + } + engines: { node: '>=14' } forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==, + } + engines: { node: '>= 0.6' } framer-motion@12.23.0: - resolution: {integrity: sha512-xf6NxTGAyf7zR4r2KlnhFmsRfKIbjqeBupEDBAaEtVIBJX96sAon00kMlsKButSIRwPSHjbRrAPnYdJJ9kyhbA==} + resolution: + { + integrity: sha512-xf6NxTGAyf7zR4r2KlnhFmsRfKIbjqeBupEDBAaEtVIBJX96sAon00kMlsKButSIRwPSHjbRrAPnYdJJ9kyhbA==, + } peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -1817,422 +2904,749 @@ packages: optional: true fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==, + } + engines: { node: '>= 0.6' } fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + resolution: + { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } os: [darwin] function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + resolution: + { + integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, + } function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==, + } + engines: { node: '>= 0.4' } function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==, + } + engines: { node: '>= 0.4' } functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + resolution: + { + integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, + } get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + resolution: + { + integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, + } + engines: { node: 6.* || 8.* || >= 10.* } get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==, + } + engines: { node: '>= 0.4' } get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==, + } + engines: { node: '>= 0.4' } get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==, + } + engines: { node: '>= 0.4' } get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==, + } + engines: { node: '>= 0.4' } get-symbol-description@1.1.0: - resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==, + } + engines: { node: '>= 0.4' } glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, + } + engines: { node: '>= 6' } glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, + } + engines: { node: '>=10.13.0' } glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + resolution: + { + integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==, + } hasBin: true globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, + } + engines: { node: '>=4' } globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==, + } + engines: { node: '>=18' } globals@16.3.0: - resolution: {integrity: sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==, + } + engines: { node: '>=18' } globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==, + } + engines: { node: '>= 0.4' } globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, + } + engines: { node: '>=10' } goober@2.1.16: - resolution: {integrity: sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==} + resolution: + { + integrity: sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==, + } peerDependencies: csstype: ^3.0.10 gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + resolution: + { + integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, + } gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==, + } + engines: { node: '>= 0.4' } graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + resolution: + { + integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, + } graphql@16.9.0: - resolution: {integrity: sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==} - engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + resolution: + { + integrity: sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==, + } + engines: { node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0 } has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + resolution: + { + integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==, + } has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: '>=8' } has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + resolution: + { + integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==, + } has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==, + } + engines: { node: '>= 0.4' } has-proto@1.2.0: - resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==, + } + engines: { node: '>= 0.4' } has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, + } + engines: { node: '>= 0.4' } has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==, + } + engines: { node: '>= 0.4' } has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==, + } + engines: { node: '>= 0.4' } hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, + } + engines: { node: '>= 0.4' } headers-polyfill@4.0.3: - resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} + resolution: + { + integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==, + } hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + resolution: + { + integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==, + } html-encoding-sniffer@4.0.0: - resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==, + } + engines: { node: '>=18' } html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + resolution: + { + integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, + } http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==, + } + engines: { node: '>= 0.8' } http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} + resolution: + { + integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==, + } + engines: { node: '>= 14' } https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} + resolution: + { + integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==, + } + engines: { node: '>= 14' } iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, + } + engines: { node: '>=0.10.0' } iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, + } + engines: { node: '>=0.10.0' } ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==, + } + engines: { node: '>= 4' } ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==, + } + engines: { node: '>= 4' } import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, + } + engines: { node: '>=6' } imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + resolution: + { + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, + } + engines: { node: '>=0.8.19' } indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==, + } + engines: { node: '>=8' } inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==, + } + engines: { node: '>= 0.4' } internal-slot@1.1.0: - resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==, + } + engines: { node: '>= 0.4' } ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==, + } + engines: { node: '>= 0.10' } is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==, + } + engines: { node: '>= 0.4' } is-array-buffer@3.0.5: - resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==, + } + engines: { node: '>= 0.4' } is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + resolution: + { + integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, + } is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==, + } + engines: { node: '>= 0.4' } is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + resolution: + { + integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==, + } is-bigint@1.1.0: - resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==, + } + engines: { node: '>= 0.4' } is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==, + } + engines: { node: '>= 0.4' } is-boolean-object@1.2.2: - resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==, + } + engines: { node: '>= 0.4' } is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, + } + engines: { node: '>= 0.4' } is-core-module@2.15.1: - resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==, + } + engines: { node: '>= 0.4' } is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==, + } + engines: { node: '>= 0.4' } is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==, + } + engines: { node: '>= 0.4' } is-data-view@1.0.2: - resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==, + } + engines: { node: '>= 0.4' } is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==, + } + engines: { node: '>= 0.4' } is-date-object@1.1.0: - resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==, + } + engines: { node: '>= 0.4' } is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, + } + engines: { node: '>=8' } hasBin: true is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: '>=0.10.0' } is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + resolution: + { + integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==, + } is-finalizationregistry@1.1.1: - resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==, + } + engines: { node: '>= 0.4' } is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, + } + engines: { node: '>=8' } is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==, + } + engines: { node: '>= 0.4' } is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: '>=0.10.0' } is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==, + } + engines: { node: '>= 0.4' } is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==, + } + engines: { node: '>= 0.4' } is-node-process@1.2.0: - resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + resolution: + { + integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==, + } is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==, + } + engines: { node: '>= 0.4' } is-number-object@1.1.1: - resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==, + } + engines: { node: '>= 0.4' } is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: '>=0.12.0' } is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + resolution: + { + integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==, + } is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==, + } + engines: { node: '>= 0.4' } is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==, + } + engines: { node: '>= 0.4' } is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==, + } + engines: { node: '>= 0.4' } is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==, + } + engines: { node: '>= 0.4' } is-shared-array-buffer@1.0.4: - resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==, + } + engines: { node: '>= 0.4' } is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==, + } + engines: { node: '>= 0.4' } is-string@1.1.1: - resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==, + } + engines: { node: '>= 0.4' } is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==, + } + engines: { node: '>= 0.4' } is-symbol@1.1.1: - resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==, + } + engines: { node: '>= 0.4' } is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==, + } + engines: { node: '>= 0.4' } is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==, + } + engines: { node: '>= 0.4' } is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==, + } + engines: { node: '>= 0.4' } is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + resolution: + { + integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==, + } is-weakref@1.1.1: - resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==, + } + engines: { node: '>= 0.4' } is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==, + } + engines: { node: '>= 0.4' } is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, + } + engines: { node: '>=8' } isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + resolution: + { + integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==, + } isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==, + } + engines: { node: '>=8' } istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==, + } + engines: { node: '>=10' } istanbul-lib-source-maps@5.0.6: - resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==, + } + engines: { node: '>=10' } istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==, + } + engines: { node: '>=8' } iterator.prototype@1.1.3: - resolution: {integrity: sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==, + } + engines: { node: '>= 0.4' } jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + resolution: + { + integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==, + } js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + resolution: + { + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, + } js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + resolution: + { + integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==, + } js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + resolution: + { + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + } hasBin: true jsdom@26.1.0: - resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==, + } + engines: { node: '>=18' } peerDependencies: canvas: ^3.0.0 peerDependenciesMeta: @@ -2240,153 +3654,279 @@ packages: optional: true jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==, + } + engines: { node: '>=6' } hasBin: true json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + resolution: + { + integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, + } json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + resolution: + { + integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, + } json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + resolution: + { + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + } json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + resolution: + { + integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, + } json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + resolution: + { + integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==, + } hasBin: true jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==, + } + engines: { node: '>=4.0' } keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + resolution: + { + integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, + } levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, + } + engines: { node: '>= 0.8.0' } lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + resolution: + { + integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, + } locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, + } + engines: { node: '>=10' } lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + resolution: + { + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + } lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + resolution: + { + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, + } loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + resolution: + { + integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, + } hasBin: true loupe@3.1.2: - resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} + resolution: + { + integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==, + } loupe@3.1.4: - resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} + resolution: + { + integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==, + } lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + resolution: + { + integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==, + } lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + resolution: + { + integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==, + } hasBin: true magic-string@0.30.12: - resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} + resolution: + { + integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==, + } magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + resolution: + { + integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==, + } magicast@0.3.5: - resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + resolution: + { + integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==, + } make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==, + } + engines: { node: '>=10' } math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==, + } + engines: { node: '>= 0.4' } media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==, + } + engines: { node: '>= 0.6' } merge-descriptors@1.0.3: - resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + resolution: + { + integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==, + } merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + } + engines: { node: '>= 8' } methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==, + } + engines: { node: '>= 0.6' } micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} + resolution: + { + integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==, + } + engines: { node: '>=8.6' } mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, + } + engines: { node: '>= 0.6' } mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, + } + engines: { node: '>= 0.6' } mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==, + } + engines: { node: '>=4' } hasBin: true min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==, + } + engines: { node: '>=4' } minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + resolution: + { + integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, + } minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { + integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==, + } + engines: { node: '>=16 || 14 >=14.17' } minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + resolution: + { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, + } minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { + integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==, + } + engines: { node: '>=16 || 14 >=14.17' } motion-dom@12.22.0: - resolution: {integrity: sha512-ooH7+/BPw9gOsL9VtPhEJHE2m4ltnhMlcGMhEqA0YGNhKof7jdaszvsyThXI6LVIKshJUZ9/CP6HNqQhJfV7kw==} + resolution: + { + integrity: sha512-ooH7+/BPw9gOsL9VtPhEJHE2m4ltnhMlcGMhEqA0YGNhKof7jdaszvsyThXI6LVIKshJUZ9/CP6HNqQhJfV7kw==, + } motion-utils@12.19.0: - resolution: {integrity: sha512-BuFTHINYmV07pdWs6lj6aI63vr2N4dg0vR+td0rtrdpWOhBzIkEklZyLcvKBoEtwSqx8Jg06vUB5RS0xDiUybw==} + resolution: + { + integrity: sha512-BuFTHINYmV07pdWs6lj6aI63vr2N4dg0vR+td0rtrdpWOhBzIkEklZyLcvKBoEtwSqx8Jg06vUB5RS0xDiUybw==, + } mrmime@2.0.0: - resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==, + } + engines: { node: '>=10' } ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + resolution: + { + integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==, + } ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + resolution: + { + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, + } msw@2.10.3: - resolution: {integrity: sha512-rpqW4wIqISJlgDfu3tiqzuWC/d6jofSuMUsBu1rwepzSwX21aQoagsd+fjahJ8sewa6FwlYhu4no+jfGVQm2IA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-rpqW4wIqISJlgDfu3tiqzuWC/d6jofSuMUsBu1rwepzSwX21aQoagsd+fjahJ8sewa6FwlYhu4no+jfGVQm2IA==, + } + engines: { node: '>=18' } hasBin: true peerDependencies: typescript: '>= 4.8.x' @@ -2395,454 +3935,808 @@ packages: optional: true mute-stream@2.0.0: - resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} - engines: {node: ^18.17.0 || >=20.5.0} + resolution: + { + integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==, + } + engines: { node: ^18.17.0 || >=20.5.0 } nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + resolution: + { + integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==, + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + resolution: + { + integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, + } negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==, + } + engines: { node: '>= 0.6' } notistack@3.0.2: - resolution: {integrity: sha512-0R+/arLYbK5Hh7mEfR2adt0tyXJcCC9KkA2hc56FeWik2QN6Bm/S4uW+BjzDARsJth5u06nTjelSw/VSnB1YEA==} - engines: {node: '>=12.0.0', npm: '>=6.0.0'} + resolution: + { + integrity: sha512-0R+/arLYbK5Hh7mEfR2adt0tyXJcCC9KkA2hc56FeWik2QN6Bm/S4uW+BjzDARsJth5u06nTjelSw/VSnB1YEA==, + } + engines: { node: '>=12.0.0', npm: '>=6.0.0' } peerDependencies: react: ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 nwsapi@2.2.20: - resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==} + resolution: + { + integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==, + } object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, + } + engines: { node: '>=0.10.0' } object-inspect@1.13.2: - resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==, + } + engines: { node: '>= 0.4' } object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==, + } + engines: { node: '>= 0.4' } object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, + } + engines: { node: '>= 0.4' } object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==, + } + engines: { node: '>= 0.4' } object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==, + } + engines: { node: '>= 0.4' } object.entries@1.1.8: - resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==, + } + engines: { node: '>= 0.4' } object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==, + } + engines: { node: '>= 0.4' } object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==, + } + engines: { node: '>= 0.4' } object.values@1.2.1: - resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==, + } + engines: { node: '>= 0.4' } on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==, + } + engines: { node: '>= 0.8' } open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==, + } + engines: { node: '>=12' } optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==, + } + engines: { node: '>= 0.8.0' } outvariant@1.4.3: - resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} + resolution: + { + integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==, + } own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==, + } + engines: { node: '>= 0.4' } p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, + } + engines: { node: '>=10' } p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, + } + engines: { node: '>=10' } package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + resolution: + { + integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==, + } parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, + } + engines: { node: '>=6' } parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, + } + engines: { node: '>=8' } parse5@7.3.0: - resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + resolution: + { + integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==, + } parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, + } + engines: { node: '>= 0.8' } path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + } + engines: { node: '>=8' } path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: '>=8' } path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + resolution: + { + integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, + } path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} + resolution: + { + integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==, + } + engines: { node: '>=16 || 14 >=14.18' } path-to-regexp@0.1.10: - resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} + resolution: + { + integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==, + } path-to-regexp@6.3.0: - resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + resolution: + { + integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==, + } path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, + } + engines: { node: '>=8' } pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + resolution: + { + integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==, + } pathval@2.0.0: - resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} - engines: {node: '>= 14.16'} + resolution: + { + integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==, + } + engines: { node: '>= 14.16' } picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + resolution: + { + integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, + } picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: '>=8.6' } picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==, + } + engines: { node: '>=12' } possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==, + } + engines: { node: '>= 0.4' } postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} - engines: {node: ^10 || ^12 || >=14} + resolution: + { + integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==, + } + engines: { node: ^10 || ^12 || >=14 } prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, + } + engines: { node: '>= 0.8.0' } prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} - - prettier@3.3.3: - resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==, + } + engines: { node: '>=6.0.0' } + + prettier@3.6.2: + resolution: + { + integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==, + } + engines: { node: '>=14' } hasBin: true pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + resolution: + { + integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==, + } proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==, + } + engines: { node: '>= 0.10' } psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + resolution: + { + integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==, + } punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, + } + engines: { node: '>=6' } qs@6.13.0: - resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} - engines: {node: '>=0.6'} + resolution: + { + integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==, + } + engines: { node: '>=0.6' } querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + resolution: + { + integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==, + } queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, + } + engines: { node: '>= 0.6' } raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==, + } + engines: { node: '>= 0.8' } react-dom@19.1.0: - resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} + resolution: + { + integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==, + } peerDependencies: react: ^19.1.0 react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + resolution: + { + integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==, + } react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + resolution: + { + integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==, + } react-is@19.1.0: - resolution: {integrity: sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==} + resolution: + { + integrity: sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==, + } react-transition-group@4.4.5: - resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + resolution: + { + integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==, + } peerDependencies: react: '>=16.6.0' react-dom: '>=16.6.0' react@19.1.0: - resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==, + } + engines: { node: '>=0.10.0' } recast@0.23.11: - resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==, + } + engines: { node: '>= 4' } redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==, + } + engines: { node: '>=8' } reflect.getprototypeof@1.0.10: - resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==, + } + engines: { node: '>= 0.4' } reflect.getprototypeof@1.0.6: - resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==, + } + engines: { node: '>= 0.4' } regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + resolution: + { + integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==, + } regexp.prototype.flags@1.5.3: - resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==, + } + engines: { node: '>= 0.4' } regexp.prototype.flags@1.5.4: - resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==, + } + engines: { node: '>= 0.4' } require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, + } + engines: { node: '>=0.10.0' } requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + resolution: + { + integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, + } resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, + } + engines: { node: '>=4' } resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + resolution: + { + integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==, + } hasBin: true resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + resolution: + { + integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==, + } hasBin: true reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + resolution: + { + integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, + } + engines: { iojs: '>=1.0.0', node: '>=0.10.0' } rollup@2.79.2: - resolution: {integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==, + } + engines: { node: '>=10.0.0' } hasBin: true rollup@4.44.1: - resolution: {integrity: sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} + resolution: + { + integrity: sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==, + } + engines: { node: '>=18.0.0', npm: '>=8.0.0' } hasBin: true rrweb-cssom@0.8.0: - resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + resolution: + { + integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==, + } run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + resolution: + { + integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==, + } safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} + resolution: + { + integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==, + } + engines: { node: '>=0.4' } safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} - engines: {node: '>=0.4'} + resolution: + { + integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==, + } + engines: { node: '>=0.4' } safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } safe-push-apply@1.0.0: - resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==, + } + engines: { node: '>= 0.4' } safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==, + } + engines: { node: '>= 0.4' } safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==, + } + engines: { node: '>= 0.4' } safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + resolution: + { + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, + } saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} + resolution: + { + integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==, + } + engines: { node: '>=v12.22.7' } scheduler@0.26.0: - resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + resolution: + { + integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==, + } semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + resolution: + { + integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, + } hasBin: true semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==, + } + engines: { node: '>=10' } hasBin: true send@0.19.0: - resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==, + } + engines: { node: '>= 0.8.0' } serve-static@1.16.2: - resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==, + } + engines: { node: '>= 0.8.0' } set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==, + } + engines: { node: '>= 0.4' } set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==, + } + engines: { node: '>= 0.4' } set-proto@1.0.0: - resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==, + } + engines: { node: '>= 0.4' } setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + resolution: + { + integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, + } shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: '>=8' } shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: '>=8' } shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + resolution: + { + integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==, + } side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==, + } + engines: { node: '>= 0.4' } side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==, + } + engines: { node: '>= 0.4' } side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==, + } + engines: { node: '>= 0.4' } side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==, + } + engines: { node: '>= 0.4' } side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==, + } + engines: { node: '>= 0.4' } siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + resolution: + { + integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==, + } signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, + } + engines: { node: '>=14' } sirv@3.0.1: - resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==, + } + engines: { node: '>=18' } slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, + } + engines: { node: '>=8' } source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, + } + engines: { node: '>=0.10.0' } source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==, + } + engines: { node: '>=0.10.0' } source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, + } + engines: { node: '>=0.10.0' } spawn-command@0.0.2: - resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} + resolution: + { + integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==, + } stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + resolution: + { + integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==, + } statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==, + } + engines: { node: '>= 0.8' } std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + resolution: + { + integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==, + } std-env@3.9.0: - resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + resolution: + { + integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==, + } stop-iteration-iterator@1.1.0: - resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==, + } + engines: { node: '>= 0.4' } storybook@9.0.14: - resolution: {integrity: sha512-PfVo9kSa4XsDTD2gXFvMRGix032+clBDcUMI4MhUzYxONLiZifnhwch4p/1lG+c3IVN4qkOEgGNc9PEgVMgApw==} + resolution: + { + integrity: sha512-PfVo9kSa4XsDTD2gXFvMRGix032+clBDcUMI4MhUzYxONLiZifnhwch4p/1lG+c3IVN4qkOEgGNc9PEgVMgApw==, + } hasBin: true peerDependencies: prettier: ^2 || ^3 @@ -2851,272 +4745,479 @@ packages: optional: true strict-event-emitter@0.5.1: - resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} + resolution: + { + integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==, + } string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, + } + engines: { node: '>=8' } string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, + } + engines: { node: '>=12' } string.prototype.matchall@4.0.11: - resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==, + } + engines: { node: '>= 0.4' } string.prototype.repeat@1.0.0: - resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + resolution: + { + integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==, + } string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==, + } + engines: { node: '>= 0.4' } string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==, + } + engines: { node: '>= 0.4' } string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + resolution: + { + integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==, + } string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==, + } + engines: { node: '>= 0.4' } string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==, + } + engines: { node: '>= 0.4' } strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: '>=8' } strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, + } + engines: { node: '>=12' } strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, + } + engines: { node: '>=4' } strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==, + } + engines: { node: '>=8' } strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, + } + engines: { node: '>=8' } strip-literal@3.0.0: - resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + resolution: + { + integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==, + } stylis@4.2.0: - resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + resolution: + { + integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==, + } supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: '>=8' } supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, + } + engines: { node: '>=10' } supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, + } + engines: { node: '>= 0.4' } symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + resolution: + { + integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==, + } synckit@0.11.8: - resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} - engines: {node: ^14.18.0 || >=16.0.0} + resolution: + { + integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==, + } + engines: { node: ^14.18.0 || >=16.0.0 } test-exclude@7.0.1: - resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==, + } + engines: { node: '>=18' } tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + resolution: + { + integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==, + } tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + resolution: + { + integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==, + } tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + resolution: + { + integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==, + } tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==, + } + engines: { node: '>=12.0.0' } tinypool@1.1.1: - resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} - engines: {node: ^18.0.0 || >=20.0.0} + resolution: + { + integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==, + } + engines: { node: ^18.0.0 || >=20.0.0 } tinyrainbow@1.2.0: - resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==, + } + engines: { node: '>=14.0.0' } tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==, + } + engines: { node: '>=14.0.0' } tinyspy@4.0.3: - resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==, + } + engines: { node: '>=14.0.0' } tldts-core@6.1.56: - resolution: {integrity: sha512-Ihxv/Bwiyj73icTYVgBUkQ3wstlCglLoegSgl64oSrGUBX1hc7Qmf/CnrnJLaQdZrCnTaLqMYOwKMKlkfkFrxQ==} + resolution: + { + integrity: sha512-Ihxv/Bwiyj73icTYVgBUkQ3wstlCglLoegSgl64oSrGUBX1hc7Qmf/CnrnJLaQdZrCnTaLqMYOwKMKlkfkFrxQ==, + } tldts@6.1.56: - resolution: {integrity: sha512-2PT1oRZCxtsbLi5R2SQjE/v4vvgRggAtVcYj+3Rrcnu2nPZvu7m64+gDa/EsVSWd3QzEc0U0xN+rbEKsJC47kA==} + resolution: + { + integrity: sha512-2PT1oRZCxtsbLi5R2SQjE/v4vvgRggAtVcYj+3Rrcnu2nPZvu7m64+gDa/EsVSWd3QzEc0U0xN+rbEKsJC47kA==, + } hasBin: true to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: '>=8.0' } toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} + resolution: + { + integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, + } + engines: { node: '>=0.6' } totalist@3.0.1: - resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==, + } + engines: { node: '>=6' } tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==, + } + engines: { node: '>=6' } tough-cookie@5.1.2: - resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==, + } + engines: { node: '>=16' } tr46@5.1.1: - resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==, + } + engines: { node: '>=18' } tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + resolution: + { + integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==, + } hasBin: true ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==, + } + engines: { node: '>=16' } peerDependencies: typescript: '>=4.2.0' ts-api-utils@2.1.0: - resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} - engines: {node: '>=18.12'} + resolution: + { + integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==, + } + engines: { node: '>=18.12' } peerDependencies: typescript: '>=4.8.4' tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + resolution: + { + integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==, + } tslib@2.8.0: - resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==} + resolution: + { + integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==, + } type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, + } + engines: { node: '>= 0.8.0' } type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==, + } + engines: { node: '>=10' } type-fest@4.26.1: - resolution: {integrity: sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==, + } + engines: { node: '>=16' } type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==, + } + engines: { node: '>= 0.6' } typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==, + } + engines: { node: '>= 0.4' } typed-array-buffer@1.0.3: - resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==, + } + engines: { node: '>= 0.4' } typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==, + } + engines: { node: '>= 0.4' } typed-array-byte-length@1.0.3: - resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==, + } + engines: { node: '>= 0.4' } typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==, + } + engines: { node: '>= 0.4' } typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==, + } + engines: { node: '>= 0.4' } typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==, + } + engines: { node: '>= 0.4' } typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==, + } + engines: { node: '>= 0.4' } typescript@5.6.3: - resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} - engines: {node: '>=14.17'} + resolution: + { + integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==, + } + engines: { node: '>=14.17' } hasBin: true unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + resolution: + { + integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==, + } unbox-primitive@1.1.0: - resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==, + } + engines: { node: '>= 0.4' } undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + resolution: + { + integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==, + } universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} + resolution: + { + integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==, + } + engines: { node: '>= 4.0.0' } unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, + } + engines: { node: '>= 0.8' } uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, + } url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + resolution: + { + integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==, + } utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} + resolution: + { + integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==, + } + engines: { node: '>= 0.4.0' } vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==, + } + engines: { node: '>= 0.8' } vite-node@3.2.4: - resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + resolution: + { + integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==, + } + engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } hasBin: true vite-plugin-eslint@1.8.1: - resolution: {integrity: sha512-PqdMf3Y2fLO9FsNPmMX+//2BF5SF8nEWspZdgl4kSt7UvHDRHVVfHvxsD7ULYzZrJDGRxR81Nq7TOFgwMnUang==} + resolution: + { + integrity: sha512-PqdMf3Y2fLO9FsNPmMX+//2BF5SF8nEWspZdgl4kSt7UvHDRHVVfHvxsD7ULYzZrJDGRxR81Nq7TOFgwMnUang==, + } peerDependencies: eslint: '>=7' vite: '>=2' vite@7.0.2: - resolution: {integrity: sha512-hxdyZDY1CM6SNpKI4w4lcUc3Mtkd9ej4ECWVHSMrOdSinVc2zYOAppHeGc/hzmRo3pxM5blMzkuWHOJA/3NiFw==} - engines: {node: ^20.19.0 || >=22.12.0} + resolution: + { + integrity: sha512-hxdyZDY1CM6SNpKI4w4lcUc3Mtkd9ej4ECWVHSMrOdSinVc2zYOAppHeGc/hzmRo3pxM5blMzkuWHOJA/3NiFw==, + } + engines: { node: ^20.19.0 || >=22.12.0 } hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 @@ -3155,8 +5256,11 @@ packages: optional: true vitest@3.2.4: - resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + resolution: + { + integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==, + } + engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } hasBin: true peerDependencies: '@edge-runtime/vm': '*' @@ -3183,81 +5287,138 @@ packages: optional: true w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==, + } + engines: { node: '>=18' } webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==, + } + engines: { node: '>=12' } whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==, + } + engines: { node: '>=18' } whatwg-mimetype@4.0.0: - resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==, + } + engines: { node: '>=18' } whatwg-url@14.2.0: - resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==, + } + engines: { node: '>=18' } which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + resolution: + { + integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==, + } which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==, + } + engines: { node: '>= 0.4' } which-builtin-type@1.1.4: - resolution: {integrity: sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==, + } + engines: { node: '>= 0.4' } which-builtin-type@1.2.1: - resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==, + } + engines: { node: '>= 0.4' } which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==, + } + engines: { node: '>= 0.4' } which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==, + } + engines: { node: '>= 0.4' } which-typed-array@1.1.19: - resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==, + } + engines: { node: '>= 0.4' } which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: '>= 8' } hasBin: true why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==, + } + engines: { node: '>=8' } hasBin: true word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==, + } + engines: { node: '>=0.10.0' } wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, + } + engines: { node: '>=8' } wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, + } + engines: { node: '>=10' } wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, + } + engines: { node: '>=12' } ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==, + } + engines: { node: '>=10.0.0' } peerDependencies: bufferutil: ^4.0.1 utf-8-validate: '>=5.0.2' @@ -3268,38 +5429,61 @@ packages: optional: true xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==, + } + engines: { node: '>=18' } xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + resolution: + { + integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==, + } y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, + } + engines: { node: '>=10' } yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==, + } + engines: { node: '>= 6' } yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, + } + engines: { node: '>=12' } yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==, + } + engines: { node: '>=12' } yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, + } + engines: { node: '>=10' } yoctocolors-cjs@2.1.2: - resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==, + } + engines: { node: '>=18' } snapshots: - '@adobe/css-tools@4.4.0': {} '@ampproject/remapping@2.3.0': @@ -4957,10 +7141,10 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-prettier@5.5.1(@types/eslint@8.56.12)(eslint-config-prettier@10.1.5(eslint@9.30.0))(eslint@9.30.0)(prettier@3.3.3): + eslint-plugin-prettier@5.5.1(@types/eslint@8.56.12)(eslint-config-prettier@10.1.5(eslint@9.30.0))(eslint@9.30.0)(prettier@3.6.2): dependencies: eslint: 9.30.0 - prettier: 3.3.3 + prettier: 3.6.2 prettier-linter-helpers: 1.0.0 synckit: 0.11.8 optionalDependencies: @@ -4993,11 +7177,11 @@ snapshots: string.prototype.matchall: 4.0.11 string.prototype.repeat: 1.0.0 - eslint-plugin-storybook@9.0.14(eslint@9.30.0)(storybook@9.0.14(@testing-library/dom@10.4.0)(prettier@3.3.3))(typescript@5.6.3): + eslint-plugin-storybook@9.0.14(eslint@9.30.0)(storybook@9.0.14(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.6.3): dependencies: '@typescript-eslint/utils': 8.35.0(eslint@9.30.0)(typescript@5.6.3) eslint: 9.30.0 - storybook: 9.0.14(@testing-library/dom@10.4.0)(prettier@3.3.3) + storybook: 9.0.14(@testing-library/dom@10.4.0)(prettier@3.6.2) transitivePeerDependencies: - supports-color - typescript @@ -5983,7 +8167,7 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier@3.3.3: {} + prettier@3.6.2: {} pretty-format@27.5.1: dependencies: @@ -6330,7 +8514,7 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - storybook@9.0.14(@testing-library/dom@10.4.0)(prettier@3.3.3): + storybook@9.0.14(@testing-library/dom@10.4.0)(prettier@3.6.2): dependencies: '@storybook/global': 5.0.0 '@testing-library/jest-dom': 6.6.3 @@ -6344,7 +8528,7 @@ snapshots: semver: 7.6.3 ws: 8.18.0 optionalDependencies: - prettier: 3.3.3 + prettier: 3.6.2 transitivePeerDependencies: - '@testing-library/dom' - bufferutil diff --git a/public/vite.svg b/public/vite.svg index e7b8dfb1..c42ec851 100644 --- a/public/vite.svg +++ b/public/vite.svg @@ -1 +1,43 @@ - \ No newline at end of file + diff --git a/src/App.tsx b/src/App.tsx index 195c5b05..0846d435 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,4 +1,4 @@ -import { Notifications, ChevronLeft, ChevronRight, Delete, Edit, Close } from '@mui/icons-material'; +import { ChevronLeft, ChevronRight, Close, Delete, Edit, Notifications } from '@mui/icons-material'; import { Alert, AlertTitle, @@ -35,8 +35,7 @@ import { useEventForm } from './hooks/useEventForm.ts'; import { useEventOperations } from './hooks/useEventOperations.ts'; import { useNotifications } from './hooks/useNotifications.ts'; import { useSearch } from './hooks/useSearch.ts'; -// import { Event, EventForm, RepeatType } from './types'; -import { Event, EventForm } from './types'; +import { Event, EventForm, RepeatType } from './types'; import { formatDate, formatMonth, @@ -77,11 +76,11 @@ function App() { isRepeating, setIsRepeating, repeatType, - // setRepeatType, + setRepeatType, repeatInterval, - // setRepeatInterval, + setRepeatInterval, repeatEndDate, - // setRepeatEndDate, + setRepeatEndDate, notificationTime, setNotificationTime, startTimeError, @@ -437,8 +436,7 @@ function App() { - {/* ! ๋ฐ˜๋ณต์€ 8์ฃผ์ฐจ ๊ณผ์ œ์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์–ด๋„ ์ฐธ์•„์ฃผ์„ธ์š”~ */} - {/* {isRepeating && ( + {isRepeating && ( ๋ฐ˜๋ณต ์œ ํ˜• @@ -475,7 +473,7 @@ function App() { - )} */} + )}