LogoSkills

e2e:kick-off

Generate unit (UseCase/BLoC) + BDD dual (widget+Patrol) + E2E three-layer test scaffolds at feature implementation time; drafts a .feature if none exists.

ํ•ญ๋ชฉ๋‚ด์šฉ
Invoke/e2e:kick-off
Aliases/e2e:ko, /e2e:bundle
Categorye2e-authoring
Complexityhigh
MCP Serversflutter-skill, patrol

/e2e:kick-off โ€” ํ…Œ์ŠคํŠธ ํ•œ ๋ฒˆ์— ๊น”์•„์ฃผ๋Š” ๋„์šฐ๋ฏธ#

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

์ƒˆ ๊ธฐ๋Šฅ์„ ๋‹ค ๋งŒ๋“ค๊ณ  ๋‚˜๋ฉด, ๊ทธ ๊ธฐ๋Šฅ์„ ๊ฒ€์ฆํ•  ํ…Œ์ŠคํŠธ 3์ข… ์„ธํŠธ๋ฅผ ํ•œ ๋ฐฉ์— ๊น”์•„์ฃผ๋Š” ๋ช…๋ น์ž…๋‹ˆ๋‹ค. ์ด์‚ฌ ๋“ค์–ด์˜จ ์ƒˆ ์ง‘์— ํ™”์žฌ๊ฒฝ๋ณด๊ธฐ, ๊ฐ€์Šค๊ฒฝ๋ณด๊ธฐ, ๋„๋‚œ๊ฒฝ๋ณด๊ธฐ๋ฅผ ํ•œ ๋ฒˆ์— ์„ค์น˜ํ•ด ์ฃผ๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด์š”.

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

  • ์ƒˆ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ๋ง‰ ๋๋‚ธ ๊ฐœ๋ฐœ์ž๊ฐ€, ๊ทธ ๊ธฐ๋Šฅ์˜ ํ…Œ์ŠคํŠธ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ์ค€๋น„ํ•˜๊ณ  ์‹ถ์„ ๋•Œ
  • PR(์ฝ”๋“œ ์ œ์ถœ)์„ ์˜ฌ๋ฆฌ๊ธฐ ์ „์— "ํ…Œ์ŠคํŠธ 3์ข…์ด ๋ชจ๋‘ ๊ฑธ๋ ค ์žˆ๋Š”์ง€" ํ™•์ธํ•˜๊ณ  ์‹ถ์„ ๋•Œ
  • cc-bricks-feature ๋‚˜ feature:* ๋ช…๋ น์œผ๋กœ ๊ธฐ๋Šฅ ๋ผˆ๋Œ€๋ฅผ ๋งŒ๋“  ์งํ›„, ํ…Œ์ŠคํŠธ ์„ธํŒ…์„ ์ž๋™์œผ๋กœ ๋๋‚ด๊ณ  ์‹ถ์„ ๋•Œ

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

๊ธฐ๋Šฅ ์ด๋ฆ„ ํ•˜๋‚˜๋งŒ ์ฃผ๋ฉด, ๊ฒ€์ฆ์šฉ ํ…Œ์ŠคํŠธ ํŒŒ์ผ๋“ค์„ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

  • Unit ํ…Œ์ŠคํŠธ โ€” ์ž‘์€ ๋ถ€ํ’ˆ ํ•˜๋‚˜ํ•˜๋‚˜๊ฐ€ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํŒŒ์ผ (UseCase / BLoC / Repository)
  • BDD ํ…Œ์ŠคํŠธ โ€” ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค(.feature)์™€, ํ™”๋ฉด ๋‹จ์œ„(widget) + ์‹ค์ œ ๊ธฐ๊ธฐ(Patrol) ์ž๋™ ๊ฒ€์ฆ ํŒŒ์ผ
  • E2E ํ…Œ์ŠคํŠธ (์„ ํƒ) โ€” ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ๊ฐ€๋กœ์ง€๋ฅด๋Š” "์‚ฌ์šฉ์ž ์—ฌ์ •" ์‹œ๋‚˜๋ฆฌ์˜ค ํŒŒ์ผ
  • ๋งˆ์ง€๋ง‰์— ์š”์•ฝ ๋ฆฌํฌํŠธ โ€” ๋งŒ๋“ค์–ด์ง„ ํŒŒ์ผ ๊ฐœ์ˆ˜, ์•„์ง ์ฑ„์›Œ์•ผ ํ•  ์ž‘์—…(TODO) ๋ชฉ๋ก, ๊ฒ€์ฆ ํ†ต๊ณผ ์—ฌ๋ถ€, ๋‹ค์Œ์— ํ•  ์ผ ์•ˆ๋‚ด

.feature ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์•„์ง ์—†์œผ๋ฉด, ์•ฑ์„ ์ง์ ‘ ๋‘˜๋Ÿฌ๋ณด๋ฉฐ ์‹œ๋‚˜๋ฆฌ์˜ค ์ดˆ์•ˆ๊นŒ์ง€ ๋Œ€์‹  ๋งŒ๋“ค์–ด ์ค„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

# ๊ธฐ๋ณธ โ€” ๊ธฐ๋Šฅ ํด๋”์—์„œ ์•Œ์•„์„œ ๊ฐ์ง€
/e2e:kick-off sign_in

# ์‹œ๋‚˜๋ฆฌ์˜ค(.feature)๊ฐ€ ์—†์„ ๋•Œ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹ ์ง€์ •
/e2e:kick-off sign_in --with-exploration   # ์•ฑ์„ ๋‘˜๋Ÿฌ๋ณด๋ฉฐ ์‹œ๋‚˜๋ฆฌ์˜ค ์ดˆ์•ˆ๋ถ€ํ„ฐ ๋งŒ๋“ค๊ธฐ
/e2e:kick-off sign_in --skeleton-only       # ์ตœ์†Œ ๋ผˆ๋Œ€ ์‹œ๋‚˜๋ฆฌ์˜ค๋งŒ ๋งŒ๋“ค๊ธฐ

# ์›ํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ข…๋ฅ˜๋งŒ ์„ ํƒ
/e2e:kick-off sign_in --layers=unit,bdd     # Unit + BDD ๋งŒ
/e2e:kick-off sign_in --layers=bdd          # BDD ๋งŒ

# ์‹ค์ œ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ๊ณ„ํš๋งŒ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
/e2e:kick-off sign_in --dry-run
  • sign_in ์ž๋ฆฌ์—๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ๊น” ๊ธฐ๋Šฅ ์ด๋ฆ„์„ ์ ์Šต๋‹ˆ๋‹ค (์†Œ๋ฌธ์ž_์–ธ๋”๋ฐ” ํ˜•์‹).
  • ์˜ต์…˜์„ ์•ˆ ๋ถ™์ด๋ฉด ๊ธฐ๋ณธ์œผ๋กœ Unit + BDD ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • ๋ฌด์—‡์ด ๋งŒ๋“ค์–ด์งˆ์ง€ ๋จผ์ € ํ™•์ธํ•˜๊ณ  ์‹ถ์œผ๋ฉด --dry-run ์œผ๋กœ ๊ณ„ํš๋งŒ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”.

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

๋Œ€๋žต ๋‹ค์Œ ์ˆœ์„œ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

  1. ์‚ฌ์ „ ์กฐ์‚ฌ โ€” ๊ธฐ๋Šฅ์ด ์‹ค์ œ๋กœ ์žˆ๋Š”์ง€, ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ํ…Œ์ŠคํŠธ๋Š” ์žˆ๋Š”์ง€, ์†๋Œ€๋ฉด ์•ˆ ๋˜๋Š”(lock) ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ์—†๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  2. Unit ํ…Œ์ŠคํŠธ ๊น”๊ธฐ โ€” ์ž‘์€ ๋ถ€ํ’ˆ๋ณ„ ํ…Œ์ŠคํŠธ ํŒŒ์ผ(UseCase / BLoC / Repository)์„ ํ•œ๊บผ๋ฒˆ์— ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  3. ์‹œ๋‚˜๋ฆฌ์˜ค(.feature) ํ™•๋ณด โ€” ์ด๋ฏธ ์žˆ์œผ๋ฉด ๊ทธ๋Œ€๋กœ ์“ฐ๊ณ , ์—†์œผ๋ฉด ์˜ต์…˜์— ๋”ฐ๋ผ ์•ฑ์„ ๋‘˜๋Ÿฌ๋ณด๋ฉฐ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ตœ์†Œ ๋ผˆ๋Œ€๋งŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  4. BDD ํ…Œ์ŠคํŠธ ๊น”๊ธฐ โ€” ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋งž๋Š” ๋‹จ๊ณ„๋ณ„ ํ…œํ”Œ๋ฆฟ์„ ๋งŒ๋“ค๊ณ , ํ™”๋ฉด ๋‹จ์œ„ + ์‹ค์ œ ๊ธฐ๊ธฐ ๊ฒ€์ฆ ํŒŒ์ผ์„ ์ž๋™ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  5. E2E ํ…Œ์ŠคํŠธ ํŒ๋‹จ (์„ ํƒ) โ€” ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ๊ฐ€๋กœ์ง€๋ฅด๋Š” "์—ฌ์ •" ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์œผ๋ฉด ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ชฝ์œผ๋กœ ์˜ฎ๊ฒจ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  6. ๊ฒ€์ฆ โ€” /pr:preflight ๋ฅผ ์ž๋™์œผ๋กœ ๋Œ๋ ค ๋ฐฉ๊ธˆ ๋งŒ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์‹ค์ œ๋กœ ํ†ต๊ณผํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์‹คํŒจํ•˜๋ฉด ์›์ธ์„ ์ •๋ฆฌํ•ด PR ์ƒ์„ฑ์„ ๋ง‰์•„ ์ค๋‹ˆ๋‹ค.
  7. ๋ฆฌํฌํŠธ โ€” ๋งŒ๋“  ํŒŒ์ผ ์ˆ˜, ๋‚จ์€ ์ž‘์—…, ๊ฒ€์ฆ ๊ฒฐ๊ณผ, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ํ•œ๋ˆˆ์— ์ •๋ฆฌํ•ด ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

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

Triggers#

  • ์ƒˆ feature ๊ตฌํ˜„ ์งํ›„ ํ…Œ์ŠคํŠธ ๋ฒˆ๋“ค์„ ์ค€๋น„ํ•  ๋•Œ
  • PR ์˜ฌ๋ฆฌ๊ธฐ ์ „์— "ํ…Œ์ŠคํŠธ 3 ๋ ˆ์ด์–ด๊ฐ€ ๋ชจ๋‘ ๊ฑธ๋ ค ์žˆ๋Š”์ง€" ๊ฒ€์ฆํ•  ๋•Œ
  • cc-bricks-feature / cc-flutter-dev:feature:* ๋กœ feature ๋งŒ๋“  ๋’ค ํ…Œ์ŠคํŠธ ์ž๋™ ์„ธํŒ…

์‚ฌ์šฉ๋ฒ•#

# ๊ธฐ๋ณธ โ€” feature ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์ž๋™ ๊ฐ์ง€
/e2e:kick-off sign_in

# .feature ์ƒ์„ฑ ๋ฐฉ๋ฒ• ๋ช…์‹œ
/e2e:kick-off sign_in --with-exploration      # flutter-skill ํƒ์ƒ‰๋ถ€ํ„ฐ
/e2e:kick-off sign_in --skeleton-only          # skeleton .feature ๋งŒ ์ƒ์„ฑ

# ํŠน์ • ๋ ˆ์ด์–ด๋งŒ
/e2e:kick-off sign_in --layers=unit,bdd        # unit + BDD ๋งŒ
/e2e:kick-off sign_in --layers=bdd             # BDD ๋งŒ

# Dry run
/e2e:kick-off sign_in --dry-run                # ์ƒ์„ฑ ๊ณ„ํš๋งŒ ์ถœ๋ ฅ

ํŒŒ๋ผ๋ฏธํ„ฐ#

ํŒŒ๋ผ๋ฏธํ„ฐํ•„์ˆ˜์„ค๋ช…๊ธฐ๋ณธ
featureโœ…feature ๋ชจ๋“ˆ ์ด๋ฆ„ (snake_case)โ€”
--with-explorationโŒ.feature ์—†์œผ๋ฉด /e2e:explore ๋จผ์ € ํ˜ธ์ถœfalse
--skeleton-onlyโŒ.feature ์—†์œผ๋ฉด ์ตœ์†Œ skeleton ์ƒ์„ฑ (ํƒ์ƒ‰ ์ƒ๋žต)false
--layersโŒ์ƒ์„ฑ ๋ ˆ์ด์–ด ์„ ํƒ (unit,bdd,e2e)unit,bdd
--dry-runโŒ์ƒ์„ฑ ๊ณ„ํš๋งŒ ์ถœ๋ ฅfalse
--deviceโŒPatrol ๊ฒ€์ฆ์šฉ ๋””๋ฐ”์ด์Šค์ž๋™ ๊ฐ์ง€

์‹คํ–‰ ๋‹จ๊ณ„#

  1. ์‚ฌ์ „ ์กฐ์‚ฌ โ€” feature ๋ชจ๋“ˆ ์กด์žฌ ํ™•์ธ, ๊ธฐ์กด ํ…Œ์ŠคํŠธ ํŒŒ์ผ ํŒŒ์•…, lock ๋ ˆ์ฝ”๋“œ ํ™•์ธ
  2. Unit ๋ ˆ์ด์–ด ์Šค์บํด๋“œ (์œ„์ž„: cc-uiux:unit-testing)
    • UseCase ํ…Œ์ŠคํŠธ ํŒŒ์ผ ์ผ๊ด„ ์ƒ์„ฑ
    • BLoC ํ…Œ์ŠคํŠธ ํŒŒ์ผ ์ƒ์„ฑ (blocTest)
    • Repository ํ…Œ์ŠคํŠธ ํŒŒ์ผ ์ƒ์„ฑ
  3. .feature ํ™•๋ณด
    • ์กด์žฌ โ†’ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ
    • ์—†๊ณ  --with-exploration โ†’ /e2e:explore + /e2e:draft
    • ์—†๊ณ  --skeleton-only โ†’ ์ตœ์†Œ skeleton ์ž‘์„ฑ
  4. BDD ๋ ˆ์ด์–ด ์Šค์บํด๋“œ
    • TestDriver step ํŒŒ์ผ ํ…œํ”Œ๋ฆฟ (TODO ์ฃผ์„)
    • build.yaml ํ™•์ธ
    • build_runner ์‹คํ–‰ โ†’ widget + patrol ์ž๋™ ์ƒ์„ฑ
  5. E2E ๋ ˆ์ด์–ด ํŒ๋‹จ (์„ ํƒ)
    • cross-feature / @journey ์‹œ๋‚˜๋ฆฌ์˜ค โ†’ integration_test/features/ ์ด๊ด€
    • test_bundle.dart + run_all_scenarios.sh ๊ฐฑ์‹ 
  6. ๊ฒ€์ฆ โ€” /pr:preflight --scope={feature-packages} ์ž๋™ ํ˜ธ์ถœ
    • Unit + Widget (๋ณ€๊ฒฝ๋œ feature ํŒจํ‚ค์ง€ ๋ฒ”์œ„)
    • Integration @smoke (์กฐ๊ฑด๋ถ€)
    • ์‹คํŒจ ์‹œ ์›์ธ ๊ทธ๋ฃนํ™” + PR ์ƒ์„ฑ ์ฐจ๋‹จ
  7. ๋ฆฌํฌํŠธ โ€” ์ƒ์„ฑ ํŒŒ์ผ ์ˆ˜, TODO ๋‚จ์€ step, preflight ๊ฒฐ๊ณผ, ๋‹ค์Œ ๋‹จ๊ณ„ ์ œ์•ˆ

์‹คํ–‰ ํ๋ฆ„ ๋‹ค์ด์–ด๊ทธ๋žจ#

   /e2e:kick-off sign_in
        โ†“
  [์‚ฌ์ „ ์กฐ์‚ฌ]
   โ”œโ”€ feature/common/auth/ ์กด์žฌ? โœ…
   โ”œโ”€ ๊ธฐ์กด ํ…Œ์ŠคํŠธ? ์ผ๋ถ€ ์žˆ์Œ
   โ””โ”€ lock ๋ ˆ์ฝ”๋“œ? ์—†์Œ
        โ†“
  [Unit ๋ ˆ์ด์–ด]
   โ”œโ”€ UseCase: SignInUseCase โ†’ test/src/domain/usecase/sign_in_usecase_test.dart
   โ”œโ”€ BLoC: SignInBloc โ†’ test/src/presentation/bloc/sign_in_bloc_test.dart
   โ””โ”€ Repository: AuthRepository โ†’ test/src/data/repository/auth_repository_test.dart
        โ†“
  [.feature ํ™•๋ณด]
   โ””โ”€ ์—†์Œ + --with-exploration
       โ†’ /e2e:explore sign_in โ†’ /e2e:draft sign_in
        โ†“
  [BDD ๋ ˆ์ด์–ด]
   โ”œโ”€ step/ ํ…œํ”Œ๋ฆฟ ์ƒ์„ฑ (i_tap_the_sign_in_button.dart ๋“ฑ)
   โ”œโ”€ build.yaml ํ™•์ธ
   โ””โ”€ build_runner โ†’ sign_in.widget_test.dart + sign_in.patrol_test.dart
        โ†“
  [E2E ๋ ˆ์ด์–ด] (์„ ํƒ)
   โ””โ”€ @journey ์‹œ๋‚˜๋ฆฌ์˜ค ์—†์Œ โ†’ skip
        โ†“
  [๊ฒ€์ฆ] /pr:preflight --scope=feature_common_auth
   โ”œโ”€ Unit   โ†’ PASS (42/0)
   โ”œโ”€ Widget โ†’ PASS (12/0, BDD widget_test ํฌํ•จ)
   โ””โ”€ Integration @smoke โ†’ SKIP (๋””๋ฐ”์ด์Šค ์—†์Œ or ์‹œ๋‚˜๋ฆฌ์˜ค ๋ฏธ์กด์žฌ)
        โ†“
  [๋ฆฌํฌํŠธ]
   โ”œโ”€ ์ƒ์„ฑ ํŒŒ์ผ 9๊ฐœ
   โ”œโ”€ TODO step 3๊ฐœ (๋ชฉ๋ก)
   โ”œโ”€ Preflight: PASS (Unit+Widget)
   โ””โ”€ ๋‹ค์Œ ๋‹จ๊ณ„: step-implement ๋กœ TODO ์ฑ„์šฐ๊ธฐ โ†’ /e2e:lock โ†’ /pr:preflight --with-integration

์ถœ๋ ฅ#

  • Unit ํ…Œ์ŠคํŠธ ํŒŒ์ผ๋“ค
  • BDD .feature + step/ ํ…œํ”Œ๋ฆฟ + ์ž๋™ ์ƒ์„ฑ widget/patrol ํ…Œ์ŠคํŠธ
  • (์„ ํƒ) E2E ์‹œ๋‚˜๋ฆฌ์˜ค ํŒŒ์ผ๋“ค + test_bundle.dart ์—…๋ฐ์ดํŠธ
  • ์ƒ์„ฑ ์š”์•ฝ ๋ฆฌํฌํŠธ + TODO ๋ชฉ๋ก

์‹คํŒจ ์ผ€์ด์Šค#

์›์ธ๋Œ€์‘
feature ๋ชจ๋“ˆ ์—†์Œcc-bricks-feature ๋˜๋Š” cc-flutter-dev:feature:* ์•ˆ๋‚ด
bdd_test_gen ๋ฏธ์„ค์ •ํ‘œ์ค€ build.yaml ๋ธ”๋ก ์ถ”๊ฐ€ ์ œ์•ˆ
--with-exploration ์š”์ฒญ์ธ๋ฐ ์•ฑ ๋ฏธ๊ธฐ๋™flutter run --dart-define=ENABLE_FLUTTER_SKILL=true ๋ช…๋ น ์•ˆ๋‚ด
lock ๋œ ์‹œ๋‚˜๋ฆฌ์˜ค ๋ฎ์–ด์“ฐ๊ธฐ ์‹œ๋„/e2e:unlock ํ•„์š” ์•ˆ๋‚ด
Patrol ๊ฒ€์ฆ ์‹คํŒจstep-implement ๋กœ TODO ์ฑ„์šฐ๊ธฐ ๊ถŒ์œ 

๊ด€๋ จ#

  • skills/feature-test-bundle/SKILL.md โ€” ์‹ค์ œ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๋ณธ์ฒด
  • commands/e2e/explore.md โ€” .feature ๊ฐ€ ์—†์„ ๋•Œ โ‘  EXPLORE ์ง„์ž…
  • commands/e2e/draft.md โ€” ์ €๋„ โ†’ .feature ์ดˆ์•ˆ
  • commands/e2e/lock.md โ€” ๋ฒˆ๋“ค ์™„์„ฑ ํ›„ ๋ฐ•์ œ
  • cc-dev-cycle:pr:preflight โ€” PR ์˜ฌ๋ฆฌ๊ธฐ ์ „ ์ž๋™ ๊ฒŒ์ดํŠธ (๋ณธ ์ปค๋งจ๋“œ๊ฐ€ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„๋กœ ํ˜ธ์ถœ)
  • ์œ„์ž„: cc-uiux:unit-testing, cc-uiux:bdd-testing, cc-uiux:integration-testing
  • ์กฐ์ง ํ‘œ์ค€: cc-flutter-dev/rules/bdd-test-patterns.md
  • PR ์ •์ฑ…: cc-dev-cycle/rules/pr-preflight-policy.md