LogoSkills

feature:create

Full Feature creation orchestration from Serverpod backend to Flutter frontend

ํ•ญ๋ชฉ๋‚ด์šฉ
Invoke/feature:create
Aliases/feature, /feature:new
Categorykobic-workflow
Complexityhigh
MCP Serversserena, sequential, context7, magic

/feature:create โ€” ๊ธฐ๋Šฅ ํ•˜๋‚˜๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ž๋™ ์กฐ๋ฆฝ#

ํ•œ๋งˆ๋””๋กœ#

์ƒˆ ๊ธฐ๋Šฅ ํ•˜๋‚˜๋ฅผ ๋งŒ๋“ค ๋•Œ, ์„œ๋ฒ„(๋ฐฑ์—”๋“œ)๋ถ€ํ„ฐ ํ™”๋ฉด(ํ”„๋ก ํŠธ์—”๋“œ)๊นŒ์ง€ ํ•œ ๋ฒˆ์— ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด ์ฃผ๋Š” "์กฐ๋ฆฝ ๋ผ์ธ" ์ž…๋‹ˆ๋‹ค. ๊ฐ€๊ตฌ ํ•˜๋‚˜๋ฅผ ๋ถ€ํ’ˆยท์„ค๋ช…์„œยท์กฐ๋ฆฝยท๊ฒ€์ˆ˜๊นŒ์ง€ ํ•œ ๋ฒˆ์— ๋๋‚ด ์ฃผ๋Š” ํ’€์„ธํŠธ ์ฃผ๋ฌธ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋ˆ„๊ฐ€ยท์–ธ์ œ ์“ฐ๋‚˜์š”#

  • ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋ฐ‘๋ฐ”๋‹ฅ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ํ•œ ๋ฒˆ์— ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๋•Œ
  • ์„œ๋ฒ„(Serverpod)์™€ ์•ฑ ํ™”๋ฉด(Flutter)์„ ๋™์‹œ์— ๋งŒ๋“ค์–ด์•ผ ํ•  ๋•Œ
  • ์ •ํ•ด์ง„ ํ‘œ์ค€ ๊ตฌ์กฐ(Clean Architecture)๋Œ€๋กœ ๋น ์ง์—†์ด ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๋•Œ

๋ฌด์—‡์„ ํ•ด์ฃผ๋‚˜์š”#

๊ธฐ๋Šฅ ์ด๋ฆ„ ํ•˜๋‚˜๋งŒ ์ฃผ๋ฉด, ๋‹ค์Œ์„ ์•Œ์•„์„œ ๋งŒ๋“ค๊ณ  ๊ฒ€์‚ฌ๊นŒ์ง€ ํ•ด ์ค๋‹ˆ๋‹ค.

  • ์„œ๋ฒ„ ์ชฝ: ๋ฐ์ดํ„ฐ ๋ชจ๋ธ, ์—”๋“œํฌ์ธํŠธ(์„œ๋ฒ„ ๊ธฐ๋Šฅ), ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ˜์˜
  • ์•ฑ ์ชฝ: ํ™”๋ฉด, ์ƒํƒœ ๊ด€๋ฆฌ ์ฝ”๋“œ, ๋ฐ์ดํ„ฐ ์—ฐ๊ฒฐ ์ฝ”๋“œ
  • ํ…Œ์ŠคํŠธ: ์ž๋™ ํ…Œ์ŠคํŠธ(BDD .feature ํŒŒ์ผ ํฌํ•จ)
  • ๋งˆ๋ฌด๋ฆฌ ๊ฒ€์‚ฌ: ์ฝ”๋“œ ๋ถ„์„, ํ…Œ์ŠคํŠธ ์‹คํ–‰, ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ ์„œ๋ฒ„๋ฅผ ๋„์›Œ ์•ฑ๊ณผ ์ž˜ ๋งž๋ฌผ๋ฆฌ๋Š”์ง€๊นŒ์ง€ ํ†ตํ•ฉ ์ ๊ฒ€

์ฆ‰, "๊ธฐ๋Šฅ ํ•˜๋‚˜"์— ํ•„์š”ํ•œ ๋ชจ๋“  ํŒŒ์ผ๊ณผ ๊ฒ€์ฆ์ด ํ•œ ๋ฌถ์Œ์œผ๋กœ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ์“ฐ๋‚˜์š”#

# ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ฒŒ์‹œ๊ธ€ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ
/feature:create community Post
  --location application
  --caching swr
  --endpoint-type app
  --fields  " title:String, content:String, category:PostCategory, imageUrls:List < String > ? " 

 # ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ
/feature:create chat Message
  --location application
  --caching cache-first
  --endpoint-type app
  --fields  " content:String, senderId:int, chatRoomId:int, readAt:DateTime? " 

 # ๊ด€๋ฆฌ์ž ๋Œ€์‹œ๋ณด๋“œ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ
/feature:create dashboard Stats
  --location console
  --caching none
  --endpoint-type console
  --fields  " totalUsers:int, totalPosts:int, activeUsers:int "
  • ์ฒซ ๋ฒˆ์งธ ๊ฐ’์€ ๊ธฐ๋Šฅ ์ด๋ฆ„(์˜ˆ: community), ๋‘ ๋ฒˆ์งธ ๊ฐ’์€ ๋ฐ์ดํ„ฐ ์ด๋ฆ„(์˜ˆ: Post)์œผ๋กœ, ๋‘˜ ๋‹ค ๊ผญ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • --location: ์–ด๋””์— ๋งŒ๋“ค์ง€ (application ์ผ๋ฐ˜ ์•ฑ / common ๊ณต์šฉ / console ๊ด€๋ฆฌ์ž, ๊ธฐ๋ณธ๊ฐ’ application)
  • --caching: ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐฉ์‹ (swr / cache-first / none, ๊ธฐ๋ณธ๊ฐ’ swr)
  • --endpoint-type: ์„œ๋ฒ„ ๊ธฐ๋Šฅ ์ข…๋ฅ˜ (app / console / both, ๊ธฐ๋ณธ๊ฐ’ app)
  • --fields: ์–ด๋–ค ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์„ ๋‹ด์„์ง€ (์˜ˆ: "title:String, content:String")
  • --with-bdd: ํ…Œ์ŠคํŠธ๋„ ๊ฐ™์ด ๋งŒ๋“ค์ง€ (๊ธฐ๋ณธ๊ฐ’ ์ผœ์ง true)

์•ˆ์—์„œ ๋ฌด์Šจ ์ผ์ด ๋ฒŒ์–ด์ง€๋‚˜์š”#

ํฌ๊ฒŒ ์—ฌ์„ฏ ๋‹จ๊ณ„๋ฅผ ์ฐจ๋ก€๋กœ ์ง„ํ–‰ํ•˜๋ฉฐ, ๋‹จ๊ณ„๋งˆ๋‹ค ํ•„์š”ํ•œ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  1. ์‚ฌ์ „ ์ ๊ฒ€(Phase 0) โ€” ์ž‘์—…์— ํ•„์š”ํ•œ ๋„๊ตฌ(๋Ÿฐํƒ€์ž„ ๊ฒ€์ฆ์šฉ MCP)๊ฐ€ ์ค€๋น„๋๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์—†์œผ๋ฉด ์ž๋™์œผ๋กœ ์„ค์น˜ยท์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  2. ์š”๊ตฌ์‚ฌํ•ญ ํ™•์ธ(Phase 1) โ€” ๊ธฐ๋Šฅ ์ด๋ฆ„, ๋‹ด์„ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ, ํ•„์š”ํ•œ ๊ธฐ๋Šฅ ๋ฒ”์œ„(๋ชฉ๋ก/์ถ”๊ฐ€/์ˆ˜์ •/์‚ญ์ œ), ์ €์žฅ ๋ฐฉ์‹, ํ…Œ์ŠคํŠธ ํฌํ•จ ์—ฌ๋ถ€๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  3. ์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ(Phase 2) โ€” ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๊ณผ ์„œ๋ฒ„ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.
  4. ์•ฑ ๋งŒ๋“ค๊ธฐ(Phase 3) โ€” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ, ๋ฐ์ดํ„ฐ ์—ฐ๊ฒฐ, ํ™”๋ฉด๊ณผ ์ƒํƒœ ๊ด€๋ฆฌ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  5. ํ…Œ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ(Phase 4) โ€” ์‹œ๋‚˜๋ฆฌ์˜ค ๊ธฐ๋ฐ˜ ์ž๋™ ํ…Œ์ŠคํŠธ(BDD)๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  6. ํ†ตํ•ฉยท๊ฒ€์ˆ˜(Phase 5) โ€” ์ฝ”๋“œ ๋ถ„์„๊ณผ ํ…Œ์ŠคํŠธ๋ฅผ ๋Œ๋ฆฌ๊ณ , ์‹ค์ œ ์„œ๋ฒ„๋ฅผ ๋„์›Œ(serverpod start) ์„œ๋ฒ„์™€ ์•ฑ์ด ์‹ค์ œ๋กœ ์ž˜ ๋งž๋ฌผ๋ฆฌ๋Š”์ง€๊นŒ์ง€ ์ตœ์ข… ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

โš™๏ธ ์ƒ์„ธ ์˜ต์…˜ยท์‹คํ–‰ ๋ช…์„ธ (๊ฐœ๋ฐœ์ž / AI ์—์ด์ „ํŠธ์šฉ)

Triggers#

  • When creating a new Feature from start to finish
  • When implementing Serverpod backend and Flutter frontend simultaneously
  • When a complete Clean Architecture workflow is needed

Context Trigger Pattern#

/feature:create {feature_name} {entity_name} [--options]

Parameters#

ParameterRequiredDescriptionExample
feature_nameโœ…Feature module name (snake_case)community, chat, wallet
entity_nameโœ…Entity name (PascalCase)Post, Message, Transaction
--locationโŒLocationapplication, common, console (default: application)
--cachingโŒCaching strategyswr, cache-first, none (default: swr)
--endpoint-typeโŒEndpoint typeapp, console, both (default: app)
--fieldsโŒField Definition"title:String, content:String"
--with-bddโŒBDD Test Generationtrue, false (default: true)
--bdd-fromโŒBDD Scenario source.claude/docs/{feature}/bdd/

Execution Flow#

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Phase 0: Preflight (MCP  &   ํ™˜๊ฒฝ ์ ๊ฒ€) โญ fvm ๊ณ ๋ ค          โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  0-1. marionette_mcp ์‹คํ–‰ ํŒŒ์ผ ์กด์žฌ ํ™•์ธ                   โ”‚
โ”‚  0-2. ๋ฏธ์„ค์น˜ ์‹œ `fvm dart pub global activate` ์ž๋™ ์‹คํ–‰   โ”‚
โ”‚  0-3. Claude Code MCP ๋“ฑ๋ก ์ƒํƒœ ํ™•์ธ (claude mcp list)    โ”‚
โ”‚  0-4. ์‹คํŒจ ์‹œ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ ์žฌ๋“ฑ๋ก + PATH ์ฃผ์ž…               โ”‚
โ”‚  0-5. Cursor/Zed MCP ์„ค์ • ํŒŒ์ผ ์กด์žฌ/๋™๊ธฐํ™” ํ™•์ธ(์„ ํƒ)      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                          โ”‚
                          โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Phase 1: Requirements gathering (Interactive)                      โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  1. Feature/Entity ์ด๋ฆ„ ํ™•์ธ                              โ”‚
โ”‚  2. ํ•„๋“œ ์ •์˜ ์ˆ˜์ง‘                                        โ”‚
โ”‚  3. CRUD ๋ฉ”์„œ๋“œ ๋ฒ”์œ„ ํ™•์ธ                                  โ”‚
โ”‚  4. ์บ์‹ฑ ์ „๋žต ์„ ํƒ                                        โ”‚
โ”‚  5. BDD ํ…Œ์ŠคํŠธ ํฌํ•จ ์—ฌ๋ถ€ ํ™•์ธ                               โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                          โ”‚
                          โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Phase 2: Backend implementation                                    โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  Step 1: /serverpod:model                                โ”‚
โ”‚  Step 2: /serverpod:endpoint                             โ”‚
โ”‚  Step 3: melos run backend:pod:generate                  โ”‚
โ”‚  Step 4: ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ (ํ•„์š” ์‹œ)                             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                          โ”‚
                          โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Phase 3: Frontend implementation                                   โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  Step 5: /feature:domain                                 โ”‚
โ”‚  Step 6: /feature:data                                   โ”‚
โ”‚  Step 7: /feature:presentation                           โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                          โ”‚
                          โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Phase 4: BDD ํ…Œ์ŠคํŠธ ์ƒ์„ฑ (--with-bdd true ์‹œ) โญ          โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  Step 8: /bdd:generate {feature_name}                    โ”‚
โ”‚  Step 9: melos run test:bdd --scope={feature}   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                          โ”‚
                          โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Phase 5: Integration and verification                                     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  Step 10: DI ๋“ฑ๋ก ํ™•์ธ                                    โ”‚
โ”‚  Step 11: Route ๋“ฑ๋ก ํ™•์ธ                                  โ”‚
โ”‚  Step 12: melos run build                                โ”‚
โ”‚  Step 13: melos run analyze                              โ”‚
โ”‚  Step 14: melos run test --scope={feature}               โ”‚
โ”‚  Step 15: melos run test:bdd --scope={feature}           โ”‚
โ”‚  Step 16: ๋กœ์ปฌ ํ’€์Šคํƒ ํ†ตํ•ฉ ๊ฒ€์ฆ โญ (serverpod start)        โ”‚
โ”‚    โ†ณ server+๋‚ด์žฅ Postgres+app ๊ธฐ๋™ โ†’ ๋กœ์ปฌ ๋ฐฑ์—”๋“œ ๋Œ€์ƒ ํ†ตํ•ฉ  โ”‚
โ”‚    โ†ณ backend: dart test -t integration / front: ๋กœ์ปฌ ๋ฐฑ์—”๋“œ โ”‚
โ”‚    โ†ณ ๋ฐฑ์—”๋“œ ๋ณ€๊ฒฝ ์‹œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜/๋กœ๊ทธ๋Š” Serverpod MCP ํ™œ์šฉ    โ”‚
โ”‚    โ†ณ ํด๋ฐฑ(3.x): docker compose up -d + dart run            โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Phase 0: Preflight (MCP & ํ™˜๊ฒฝ ์ ๊ฒ€)#

๋ชฉ์ : ๊ธฐ๋Šฅ ์ž‘์—… ์ „์— ๋Ÿฐํƒ€์ž„ ๊ฒ€์ฆ(marionette_mcp)์ด ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์ธ์ง€ ํ™•์ธํ•˜๊ณ , ํ•„์š”ํ•˜๋ฉด ์ž๋™ ์„ค์น˜ยท์žฌ๋“ฑ๋ก. fvm ํ™˜๊ฒฝ์„ ์ „์ œ๋กœ ํ•จ.

Step 0-1. ์‹คํ–‰ ํŒŒ์ผ ์กด์žฌ ํ™•์ธ#

MCP_BIN= " $HOME/.pub-cache/bin/marionette_mcp " 

 if [ ! -x  " $MCP_BIN "   ]; then
  echo  " โš ๏ธ  marionette_mcp ๋ฏธ์„ค์น˜ โ€” ์ž๋™ ์„ค์น˜๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. " 
   NEEDS_INSTALL=1
else
  echo  " โœ… marionette_mcp ์„ค์น˜๋จ: $MCP_BIN " 
 fi

Step 0-2. fvm ๊ฒฝ์œ  ์ž๋™ ์„ค์น˜#

์ค‘์š”: dart๋Š” zshrc alias(fvm dart)๋ผ GUI ์•ฑ์˜ subprocess ํ™˜๊ฒฝ์—์„œ๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š์Œ โ†’ ํ•ญ์ƒ fvm dart๋กœ ์‹คํ–‰.

if [  " $NEEDS_INSTALL "   =  " 1 "   ]; then
  # fvm default SDK๋กœ ๊ธ€๋กœ๋ฒŒ ํ™œ์„ฑํ™” (ํ”„๋กœ์ ํŠธ๋ณ„ SDK์™€ ๋ณ„๊ฐœ)
  fvm dart pub global activate marionette_mcp

  # PATH ํ™•์ธ
  case  " :$PATH: "   in
    * " :$HOME/.pub-cache/bin: " *) ;;
    *)
      echo  ' export PATH= " $PATH:$HOME/.pub-cache/bin " '   > >   " $HOME/.zshrc " 
       export PATH= " $PATH:$HOME/.pub-cache/bin " 
       ;;
  esac
fi

Step 0-3. Claude Code MCP ๋“ฑ๋ก ์ƒํƒœ ํ™•์ธ#

if ! claude mcp list 2 > & 1 | grep -q  " marionette:.*โœ“ Connected " ; then
  echo  " โš ๏ธ  marionette MCP ์—ฐ๊ฒฐ ์‹คํŒจ โ€” ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ ์žฌ๋“ฑ๋ก " 
   claude mcp remove marionette 2 > /dev/null || true
  claude mcp add --transport stdio marionette --  " $HOME/.pub-cache/bin/marionette_mcp " 
   claude mcp list | grep marionette
fi

Step 0-4. Cursor / Zed ์„ค์ • ๋™๊ธฐํ™” (์„ ํƒ)#

GUI ์•ฑ์€ ~/.zshrc์˜ PATH/alias๋ฅผ ์ฝ์ง€ ์•Š์Œ โ†’ ์ ˆ๋Œ€ ๊ฒฝ๋กœ + env.PATH ์ฃผ์ž… ํ•„์ˆ˜.

Cursor (~/.cursor/mcp.json):

{
   " mcpServers " : {
     " marionette " : {
       " command " :  " /Users/dongwoo/.pub-cache/bin/marionette_mcp " ,
       " env " : {  " PATH " :  " /Users/dongwoo/fvm/default/bin:/usr/bin:/bin "   }
    }
  }
}

Zed (~/.config/zed/settings.json):

{
   " context_servers " : {
     " marionette " : {
       " command " : {
         " path " :  " /Users/dongwoo/.pub-cache/bin/marionette_mcp " ,
         " env " : {  " PATH " :  " /Users/dongwoo/fvm/default/bin:/usr/bin:/bin "   }
      }
    }
  }
}

Step 0-5. ๋Œ€์ƒ Flutter ์•ฑ ์ „์ œ ์กฐ๊ฑด ์•ˆ๋‚ด#

MCP๋Š” ๋–  ์žˆ์–ด๋„ ๋Œ€์ƒ ์•ฑ์— marionette_flutter ํ†ตํ•ฉ์ด ์—†์œผ๋ฉด ๋ถ™์ง€ ๋ชปํ•จ. Phase 4.7(์‹ค ๋™์ž‘ ๊ตฌํ˜„) ์ง์ „์— ์ ๊ฒ€:

# pubspec.yaml
dev_dependencies:
  marionette_flutter: ^latest
// main.dart (debug build ํ•œ์ •)
void main() {
  MarionetteBinding.ensureInitialized();
  runApp(const MyApp());
}

snapshot ๋ฒ„์ „ ๋ถˆ์ผ์น˜(exit 253): fvm ํ”„๋กœ์ ํŠธ SDK ์ „ํ™˜ ํ›„ ๋ฐœ์ƒ ๊ฐ€๋Šฅ. ๋ž˜ํผ๊ฐ€ dart pub global run์œผ๋กœ fallbackํ•˜์ง€๋งŒ ๋ฐ˜๋ณต๋˜๋ฉด fvm dart pub global activate marionette_mcp ์žฌ์‹คํ–‰.

Preflight ๊ฒŒ์ดํŠธ#

์œ„ 5๋‹จ๊ณ„ ๋ชจ๋‘ ํ†ต๊ณผํ•ด์•ผ Phase 1 ์ง„์ž…. ์‹คํŒจ ์‹œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์›์ธ ๋ณด๊ณ  ํ›„ ์ค‘๋‹จ.


Phase 1: Requirements Gathering#

Interactive Mode#

## Feature Creation Requirements

### default ์ •๋ณด
- **Feature name**: {feature_name}
- **Entity name**: {entity_name}
- **Location**: application / common / console

### Entity Fields
| Field Name | Type | Required | Description |
|--------|------|------|------|
| title | String | โœ… | Title |
| content | String | โœ… | Content |
| category | Enum | โœ… | Category |

### CRUD Methods
- [x] List query (pagination)
- [x] Single item query
- [x] Create
- [x] Update
- [x] Delete

### Caching Strategy
- [x] SWR (Stale-While-Revalidate)
- [ ] Cache-First
- [ ] None

Phase 2: Backend Implementation#

Step 1: Serverpod Model#

# Run /serverpod:model command
/serverpod:model {feature_name} {entity_name}
  --fields  " {fields} " 
   --has-crud true

Generated Files:

  • backend/.../model/entities/{entity_name}.spy.yaml
  • backend/.../model/dto/...
  • backend/.../model/enum/...

Step 2: Serverpod Endpoint#

# Run /serverpod:endpoint command
/serverpod:endpoint {feature_name} {entity_name}
  --type {endpoint_type}

Generated Files:

  • backend/.../endpoint/{feature_name}_endpoint.dart
  • backend/.../service/{feature_name}_service.dart

Step 3: Code Generation#

melos run backend:pod:generate

Step 4: Migration#

melos run backend:pod:create-migration
melos run backend:pod:run-migration

Phase 3: Frontend Implementation#

Step 5: Domain Layer#

# Run /feature:domain command
/feature:domain {feature_name} {entity_name}
  --location {location}

Generated Files:

  • Entity, Repository Interface, UseCase
  • UseCase Test

Step 6: Data Layer#

# Run /feature:data command
/feature:data {feature_name} {entity_name}
  --location {location}
  --caching {caching}

Generated Files:

  • Repository Implementation์ฒด, Serverpod Mixin
  • Cache Strategy, Local DB (Drift)

Step 7: Presentation Layer#

# Run /feature:presentation command
/feature:presentation {feature_name} {entity_name}
  --location {location}

Generated Files:

  • BLoC (Event, State), BLoC Test
  • Page, Widget, Widget Test
  • Route, Widgetbook UseCase

Phase 4: BDD Test Generation#

--with-bdd true (default) executed:

Step 8: BDD Scenario and Step Generation#

# Run /bdd:generate command
/bdd:generate {feature_name}
  --entity-name {entity_name}
  --location {location}
  --from-claude-docs true  # .claude/docs์— BDD ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ

Generated Files:

feature/{location}/{feature_name}/
โ”œโ”€โ”€ build.yaml                    # BDD ๋นŒ๋” ์„ค์ •
โ””โ”€โ”€ test/src/bdd/
    โ”œโ”€โ”€ {feature}_list.feature
    โ”œโ”€โ”€ {feature}_detail.feature
    โ”œโ”€โ”€ {feature}_form.feature
    โ”œโ”€โ”€ step/
    โ”‚   โ”œโ”€โ”€ common_steps.dart     # ๊ณต์šฉ ์Šคํ… import
    โ”‚   โ””โ”€โ”€ {feature}_steps.dart  # Feature ์ „์šฉ ์Šคํ…
    โ””โ”€โ”€ hooks/
        โ””โ”€โ”€ hooks.dart            # Setup/Teardown

Step 9: Generate BDD test code#

# Run bdd_widget_test builder
melos run test:bdd --scope={feature_name}

Generation result: Auto-generated test code from .feature files

Phase 5: Integration and Verification#

Step 10: Dependency Wiring Verification#

Items to verify: No di/ folder, no getIt usage, direct BlocProvider creation

// ํŽ˜์ด์ง€์—์„œ BLoC ์ง์ ‘ ์ƒ์„ฑ
BlocProvider(create: (_) => {Feature}Bloc())

Step 9: Route Registration Verification#

File to verify: feature/{type}/{feature}/lib/src/route/{feature}_route.dart (TypedGoRoute/GoRouteData per-feature; kobic์—๋Š” ๋‹จ์ผ app_router.dart๊ฐ€ ์—†๊ณ  ๋ผ์šฐํŠธ๋Š” feature ๋ชจ๋“ˆ๋ณ„๋กœ ๋ถ„์‚ฐ ์ •์˜๋จ)

Step 10-12: Build and test#

melos run build
melos run analyze
melos run test --scope={feature_name}

Step 16: ๋กœ์ปฌ ํ’€์Šคํƒ ํ†ตํ•ฉ ๊ฒ€์ฆ (Serverpod 4 / ๋กœ์ปฌ ํ’€์Šคํƒ) โญ#

๋ชฉ์ : ์œ„์ ฏ/์œ ๋‹› ํ…Œ์ŠคํŠธ(mock)์™€ ๋ณ„๊ฐœ๋กœ, ์‹ค์ œ ๋ฐฑ์—”๋“œ๋ฅผ ๋„์šด ์ƒํƒœ์—์„œ backendโ†”front ๊ณ„์•ฝ์„ ๊ฒ€์ฆํ•œ๋‹ค. Serverpod 4์˜ ๋‚ด์žฅ Postgres ๋•๋ถ„์— Docker ์—†์ด ์™„์ „ ๋กœ์ปฌ๋กœ ํ†ตํ•ฉํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

์–ธ์ œ ์ผœ๋Š”๊ฐ€: Phase 2(Backend)์—์„œ ๋ชจ๋ธ/์—”๋“œํฌ์ธํŠธ๊ฐ€ ์ถ”๊ฐ€ยท๋ณ€๊ฒฝ๋˜์—ˆ๊ฑฐ๋‚˜, Phase 3 data layer๊ฐ€ ์‹ค์ œ endpoint๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ. ์ˆœ์ˆ˜ ์œ„์ ฏ/์œ ๋‹›๋งŒ ๋ฐ”๋€ ๊ฒฝ์šฐ๋Š” ์ƒ๋žต ๊ฐ€๋Šฅ(๊ธฐ์กด mock ํ…Œ์ŠคํŠธ๋กœ ์ถฉ๋ถ„).

  1. ๋กœ์ปฌ ํ’€์Šคํƒ ๊ธฐ๋™ โ€” serverpod start ํ•œ ๋ช…๋ น์œผ๋กœ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ + ๋‚ด์žฅ Postgres + Flutter ์•ฑ์„ ํ•จ๊ป˜ ๊ธฐ๋™ํ•œ๋‹ค(์„œ๋ฒ„ยทDBยท์›นยท์•ฑ sub-second stateful ํ•ซ๋ฆฌ๋กœ๋“œ, ์žฌ์ปดํŒŒ์ผ/์žฌ์‹œ์ž‘ ์—†์Œ). ์•ฑ์€ dev flavor์—์„œ ๋กœ์ปฌ ์„œ๋ฒ„(http://localhost:8080/)๋กœ ์—ฐ๊ฒฐ๋˜๊ณ  Staging์€ ํด๋ฐฑ์ด๋‹ค. ํ•ซ๋ฆฌ๋กœ๋“œ๊ฐ€ ๋ง‰ํžˆ๋ฉด serverpod start ํ„ฐ๋ฏธ๋„์—์„œ R ํ‚ค๋กœ ์„œ๋ฒ„+์•ฑ ๊ฐ•์ œ ์žฌ์‹œ์ž‘.

  2. ๋กœ์ปฌ ๋ฐฑ์—”๋“œ ๋Œ€์ƒ ํ†ตํ•ฉ ๊ฒ€์ฆ

    • ๋ฐฑ์—”๋“œ: withServerpod ํ—ฌํผ ๊ธฐ๋ฐ˜ ํ†ตํ•ฉํ…Œ์ŠคํŠธ๋ฅผ dart test -t integration์œผ๋กœ ์‹คํ–‰(๋‚ด์žฅ Postgres๋ผ Docker ๋ถˆํ•„์š”, ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์ค‘ ๋ฐ”๋กœ endpoint ํ†ตํ•ฉํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ).
    • ํ”„๋ก ํŠธ: feature/Patrol/ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋Š” mock์ด ์•„๋‹ˆ๋ผ ๋ฐฉ๊ธˆ ๋„์šด ๋กœ์ปฌ ๋ฐฑ์—”๋“œ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ˆ˜ํ–‰. base-URL์€ ์•ฑ์˜ ๊ธฐ์กด client/OpenApiService/flavor ์„ค์ •์„ ๋”ฐ๋ฅด๊ณ  ํ•˜๋“œ์ฝ”๋”ฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  3. ๋ฐฑ์—”๋“œ ๋ณ€๊ฒฝ ์‹œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ยท๋กœ๊ทธ๋Š” Serverpod MCP ํ™œ์šฉ โ€” ์‹คํ–‰ ์ค‘์ธ ๋กœ์ปฌ ์„œ๋ฒ„์— ์—์ด์ „ํŠธ๊ฐ€ ์—ฐ๊ฒฐํ•ด DB ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ƒ์„ฑยท์ ์šฉ, ์„œ๋ฒ„ ๋กœ๊ทธ ์ฝ๊ธฐ, ์•ฑ ๊ตฌ๋™+์Šคํฌ๋ฆฐ์ƒท ๊ฒ€ํ† ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  4. Serverpod 3.x ํ™˜๊ฒฝ ํด๋ฐฑ โ€” ๋‚ด์žฅ Postgres๊ฐ€ ์—†๋Š” 3.x(legacy)์—์„œ๋Š” docker compose up -d๋กœ DB๋ฅผ ๋„์šด ๋’ค dart run bin/main.dart๋กœ ์„œ๋ฒ„๋ฅผ ๊ธฐ๋™ํ•˜๊ณ  ๋™์ผํ•˜๊ฒŒ dart test -t integration ์ˆ˜ํ–‰.

์ƒ์„ธ ์ ˆ์ฐจ๋Š” serverpod-local-fullstack, serverpod-mcp-guide ์Šคํ‚ฌ์„ ์ฐธ์กฐ.

TodoWrite Template#

TodoWrite([
  // Phase 0: Preflight
  {"content": "marionette_mcp ์„ค์น˜ ํ™•์ธ (fvm dart pub global activate)", "status": "pending", "activeForm": "marionette_mcp Preflight ์ค‘"},
  {"content": "Claude Code MCP ๋“ฑ๋ก ์ƒํƒœ ํ™•์ธ/์žฌ๋“ฑ๋ก", "status": "pending", "activeForm": "MCP ๋“ฑ๋ก ํ™•์ธ ์ค‘"},

  // Backend
  {"content": "Generate Serverpod model", "status": "pending", "activeForm": "Generate Serverpod model in progress"},
  {"content": "Generate Serverpod endpoint", "status": "pending", "activeForm": "Generate Serverpod endpoint in progress"},
  {"content": "backend:pod:generate ์‹คํ–‰", "status": "pending", "activeForm": "backend:pod:generate running"},

  // Frontend - Domain
  {"content": "Generate Domain Entity", "status": "pending", "activeForm": "Generate Domain Entity in progress"},
  {"content": "Generate Repository Interface", "status": "pending", "activeForm": "Generate Repository Interface in progress"},
  {"content": "Generate UseCase", "status": "pending", "activeForm": "Generate UseCase in progress"},
  {"content": "Generate UseCase tests", "status": "pending", "activeForm": "Generate UseCase tests in progress"},

  // Frontend - Data
  {"content": "Generate Repository implementation", "status": "pending", "activeForm": "Generate Repository implementation in progress"},
  {"content": "Generate Serverpod Mixin", "status": "pending", "activeForm": "Generate Serverpod Mixin in progress"},

  // Frontend - Presentation
  {"content": "Generate BLoC", "status": "pending", "activeForm": "Generate BLoC in progress"},
  {"content": "Generate BLoC tests", "status": "pending", "activeForm": "Generate BLoC tests in progress"},
  {"content": "Generate Page/Widget", "status": "pending", "activeForm": "Generate Page/Widget in progress"},
  {"content": "Generate Widget tests", "status": "pending", "activeForm": "Generate Widget tests in progress"},
  {"content": "Define Routes", "status": "pending", "activeForm": "Define Routes in progress"},
  {"content": "Generate Widgetbook UseCase", "status": "pending", "activeForm": "Generate Widgetbook UseCase in progress"},

  // BDD ํ…Œ์ŠคํŠธ (--with-bdd true ์‹œ)
  {"content": "Generate BDD .feature files", "status": "pending", "activeForm": "Generate BDD .feature files in progress"},
  {"content": "Generate BDD Step definitions", "status": "pending", "activeForm": "Generate BDD Step definitions in progress"},
  {"content": "Configure BDD Hooks", "status": "pending", "activeForm": "Configure BDD Hooks in progress"},
  {"content": "Generate BDD test code", "status": "pending", "activeForm": "Generate BDD test code in progress"},

  // Integration
  {"content": "Code generation and analysis", "status": "pending", "activeForm": "Code generation and analysis in progress"},
  {"content": "Run unit tests", "status": "pending", "activeForm": "Run unit tests in progress"},
  {"content": "Run BDD tests", "status": "pending", "activeForm": "Run BDD tests in progress"},
  {"content": "๋กœ์ปฌ ํ’€์Šคํƒ ๊ธฐ๋™ (serverpod start: server+๋‚ด์žฅ Postgres+app)", "status": "pending", "activeForm": "๋กœ์ปฌ ํ’€์Šคํƒ ๊ธฐ๋™ ์ค‘"},
  {"content": "๋กœ์ปฌ ๋ฐฑ์—”๋“œ ๋Œ€์ƒ ํ†ตํ•ฉ ๊ฒ€์ฆ (backend dart test -t integration / front ๋กœ์ปฌ ๋ฐฑ์—”๋“œ)", "status": "pending", "activeForm": "๋กœ์ปฌ ๋ฐฑ์—”๋“œ ํ†ตํ•ฉ ๊ฒ€์ฆ ์ค‘"},
])

MCP Integration#

PhaseMCP ServerPurpose
Requirements analysisSequentialComplex analysis and planning
BackendSerena, Context7Pattern analysis, Serverpod Document
DomainSerena, Context7UseCase Pattern, Clean Architecture
DataSerena, Context7Mixin Pattern, Drift Document
PresentationMagic, SerenaUI generation, BLoC Pattern
VerificationSerenaSymbol search, reference verification

Reference Agents#

Reference ${CLAUDE_PLUGIN_ROOT}/commands/agents/feature-orchestrator-agent.md for detailed implementation rules

Examples#

Create Community Post Feature#

/feature:create community Post
  --location application
  --caching swr
  --endpoint-type app
  --fields  " title:String, content:String, category:PostCategory, imageUrls:List < String > ? "

Create Chat Message Feature#

/feature:create chat Message
  --location application
  --caching cache-first
  --endpoint-type app
  --fields  " content:String, senderId:int, chatRoomId:int, readAt:DateTime? "

Create Admin Dashboard Feature#

/feature:create dashboard Stats
  --location console
  --caching none
  --endpoint-type console
  --fields  " totalUsers:int, totalPosts:int, activeUsers:int "

Success Criteria#

  1. โœ… All files generated in correct locations
  2. โœ… melos run analyze No errors
  3. โœ… melos run test --scope={feature_name} Passes
  4. โœ… melos run test:bdd --scope={feature_name} Passes (--with-bdd true when)
  5. โœ… DI Registration complete
  6. โœ… Route Registration complete
  7. โœ… Components verifiable from Widgetbook
  8. โœ… BDD .feature File Gherkin ๋ฌธ๋ฒ• ์ค€์ˆ˜
  9. โœ… ๋กœ์ปฌ ํ’€์Šคํƒ(serverpod start: server+๋‚ด์žฅ Postgres+app) ๊ธฐ๋™ ์„ฑ๊ณต โ€” ๋ฐฑ์—”๋“œ ๋ณ€๊ฒฝ ์‹œ
  10. โœ… ๋กœ์ปฌ ๋ฐฑ์—”๋“œ ๋Œ€์ƒ ํ†ตํ•ฉ ๊ฒ€์ฆ ํ†ต๊ณผ (backend dart test -t integration / front๋Š” ๋กœ์ปฌ ๋ฐฑ์—”๋“œ ๋Œ€์ƒ). 3.x ํด๋ฐฑ: docker compose up -d + dart run

Core Rules Summary#

Backend#

  • Korean comments on all fields
  • Follow import order
  • Separate business logic into Service

Domain#

  • UseCase const constructor + Optional Constructor Injection
  • getIt/@injectable prohibited
  • All UseCase tests required

Data#

  • Serverpod Mixin as pod namespace required
  • SWR/Cache-First caching strategy

Presentation#

  • BLoC Event: sealed class + private implementation
  • UseCase Optional Constructor Injection (Bloc(useCase: mockUseCase) Test)
  • Widget super.key last position
  • BLoC/Widget tests required
  • Widgetbook reflection required