Imported from xtone/ai_development_tools (
flutter_development/skills/e2e-test-generator/SKILL.md). Install upstream withnpx skills add xtone/ai_development_tools --skill e2e-test-generator. Copyright stays with the author.
Flutter E2E ãã¹ãèªåçæã¹ãã«
ç®ç
ãã¹ã仿§æžïŒExcel / NotionïŒã Source of Truth ãšããŠãFlutter ã® integration_test ã³ãŒããèªåçæããã ãã¹ãã³ãŒãã¯ãèªç¶èšèªä»æ§ã® Dart ãžã®ãã³ãŒãçµæãã§ãããäœ¿ãæšãŠã®äžéçæç©ãšããŠæ±ãã
æ žå¿ææ³
ãå£ãã«ãããããã®ã§ã¯ãªããåçæã³ã¹ããéããªããŒãã«ããã
- ãã¹ã倱æ â ã³ãŒãããã°ã£ãŠãã â ã³ãŒããçŽãïŒãã¹ãã¯æ£ããïŒ
- 仿§å€æŽ â ãã¹ããå€ã â ãã¹ããåçæïŒä»æ§ãæ£ããïŒ
- ãã¹ãã³ãŒããæã§ä¿å®ããªãã仿§æžãæŽæ°ãããã¹ããåçæããã
䜿çšã¿ã€ãã³ã°
以äžã®çºèšã§çºåïŒ
- ãE2E ãã¹ããçæããŠããintegration_test ãäœã£ãŠã
- ããã¹ã仿§æžãããã¹ãã³ãŒããçæã
- ãST-AUTH-001 ã®ãã¹ããçæããŠã
- ããããã³ã°ã¬ããŒããäœæã
åææ¡ä»¶
- Flutter ãããžã§ã¯ãã§ããããš
- ãã¹ã仿§æžãååšããããšïŒExcel ãã¡ã€ã«ãŸã㯠Notion ããŒãžïŒ
integration_test/ãã£ã¬ã¯ããªã䜿çšå¯èœã§ããããš
å®è¡ãããŒ
Phase 0: ãããžã§ã¯ãè§£æïŒå¿ é ã»æåã«å®è¡ïŒ
Step 0-1: ãããžã§ã¯ãæ§é ã®ç¢ºèª
1. pubspec.yaml ãèªã¿èŸŒã¿ã以äžãæ€åºïŒ
- flutter_test / integration_test ã®äŸå
- ç¶æ
管çïŒriverpod, bloc, provider çïŒ
- ã«ãŒãã£ã³ã°ïŒauto_route, go_router çïŒ
2. lib/ ã®ãã£ã¬ã¯ããªæ§é ãè§£æïŒ
- ç»é¢ãã¡ã€ã«ã®ãã¹ïŒlib/ui/, lib/presentation/, lib/features/ çïŒ
- æ¢åã® Keys ã¯ã©ã¹ïŒ*_keys.dartïŒ
- æ¢åã® integration_test/
3. çµæããŠãŒã¶ãŒã«ç¢ºèªïŒ
ããããžã§ã¯ãæ§é ãè§£æããŸããïŒ
- UIå±€: lib/ui/{module}/
- ç¶æ
管ç: Riverpod
- ã«ãŒãã£ã³ã°: auto_route
- æ¢åKeys: ãªã / 3ãã¡ã€ã«æ€åº
ãã®èªèã§åã£ãŠããŸããïŒã
ããã§ãŠãŒã¶ãŒã®åçãåŸ ã€ã次ã®ã¹ãããã«é²ãŸãªãã
Step 0-2: Key èŠçŽã®ç¢ºèª
æ¢åã® Key éçšã確èªããKey èŠçŽãææ¡ããã
æ¢åã® Key ãæ€çŽ¢ïŒ
- `Key('...')` ã `ValueKey('...')` ã®ãã¿ãŒã³
- æ¢åã® Keys ã¯ã©ã¹
çµæã«å¿ããŠïŒ
- æ¢åèŠçŽãã â ããã«åŸã
- æ¢åèŠçŽãªã â æšæºèŠçŽãææ¡ïŒreferences/key-convention.md åç
§ïŒ
ããã§ãŠãŒã¶ãŒã®åçãåŸ ã€ã
Step 0-3: ã«ã¹ã¿ã ãŠã£ãžã§ããã®æ€åº
ãããžã§ã¯ãåºæã®ãŠã£ãžã§ãããã¿ãŒã³ãäºåã«ææ¡ããã
1. ã©ãããŒãŠã£ãžã§ããã®æ€åº:
- CustomTextFormField çã®ã«ã¹ã¿ã å
¥åãŠã£ãžã§ãããæ€çŽ¢
- `super.key` ã®æç¡ã確èªïŒKey äŒæã®å¯åŠå€å®ïŒ
- Key ãåãåããªãã©ãããŒã«ã¯ KeyedSubtree ã§ã®å¯Ÿå¿ãå¿
èŠ
2. èªèšŒãããŒãã¿ãŒã³ã®å€å®:
- çŽæ¥ãã°ã€ã³ç»é¢ãã¿ãŒã³: ã¢ããªèµ·å â LoginPage
- AuthWall çµç±ãã¿ãŒã³: ã¢ããªèµ·å â AuthWall â LoginPageïŒ2段éèªèšŒãããŒïŒ
- AuthWall ãããå ŽåãAuthWall çšã® Keys / Page Object ãå¿
èŠ
3. ããã¹ãå
¥åãŠã£ãžã§ããã®çš®é¡å€å®:
- çã® TextField / TextFormField â tester.enterText() ãçŽæ¥äœ¿çšå¯èœ
- ã«ã¹ã¿ã ã©ãããŒïŒCustomTextFormField çïŒâ find.descendant ãã¿ãŒã³ãå¿
èŠ
4. çµæããŠãŒã¶ãŒã«ç¢ºèªïŒ
ãã«ã¹ã¿ã ãŠã£ãžã§ãããæ€åºããŸããïŒ
- ããã¹ãå
¥å: CustomTextFormFieldïŒsuper.key ãã â çŽæ¥ Key ä»äžå¯èœïŒ
- èªèšŒãããŒ: AuthWall çµç±ïŒ2段éïŒ
- ããã²ãŒã·ã§ã³: AutoTabsScaffold + BottomNavigationTabItem
ãã®èªèã§åã£ãŠããŸããïŒã
ããã§ãŠãŒã¶ãŒã®åçãåŸ ã€ã
Phase 1: ãã¹ã仿§æžã®èªã¿åã
Excel ã®å Žå
- ãŠãŒã¶ãŒã«ãã¡ã€ã«ãã¹ã確èª
- Excel ãã¡ã€ã«ãè§£æãã以äžã®ã«ã©ã ãç¹å®ïŒ
- 詊éšé
ç®IDïŒäŸ:
ST-AUTH-001ïŒ - 詊éšå 容ïŒã·ããªãªã®èª¬æïŒ
- åææ¡ä»¶ïŒãã°ã€ã³ç¶æ ãããŒã¿çïŒ
- æé ïŒçªå·ä»ãæäœã¹ãããïŒ
- æåŸ çµæïŒçªå·ä»ãæåŸ å€ïŒ
- 詊éšé
ç®IDïŒäŸ:
- è§£æçµæããŠãŒã¶ãŒã«è¡šç€ºããŠç¢ºèª
Notion ã®å Žå
- Notion MCP ã䜿çšããŠããŒãž/ããŒã¿ããŒã¹ãèªã¿åã
- åæ§ã®ã«ã©ã æ§é ãç¹å®
- è§£æçµæããŠãŒã¶ãŒã«è¡šç€ºããŠç¢ºèª
éèŠ: æé ãšæåŸ çµæã¯çªå·ã§å¯Ÿå¿ä»ããã
ããã¹ã仿§ãèªã¿åããŸããïŒ
ST-AUTH-001: æ£åžžãã°ã€ã³/ãã°ã¢ãŠã
- åææ¡ä»¶: æªãã°ã€ã³ç¶æ
- æé : 7ã¹ããã
- æåŸ
çµæ: 7é
ç®
- 察象ç»é¢: ãã°ã€ã³ç»é¢ãããŒã ç»é¢ããã€ããŒãž
ãã®ä»æ§ã§ãã¹ããçæããŸããïŒã
ããã§ãŠãŒã¶ãŒã®åçãåŸ ã€ã
Phase 2: ç»é¢ã³ãŒãè§£æ + Key ãããã³ã°
Step 2-1: 察象ç»é¢ã®ç¹å®
仿§æžã®æé ãããæäœå¯Ÿè±¡ã®ç»é¢ãæšå®ããã
仿§: ããã°ã€ã³ç»é¢ã§ã¡ãŒã«ã¢ãã¬ã¹ãå
¥åã
â ãã°ã€ã³ç»é¢ã® Dart ãã¡ã€ã«ãæ¢çŽ¢
â lib/ui/auth/login_screen.dart ãçºèŠ
Step 2-2: æ¢å Key ã®åé
察象ç»é¢ã® Widget ããªãŒãè§£æããæ¢åã® Key ãåéããã
// æ€çŽ¢å¯Ÿè±¡
Key('...')
ValueKey('...')
const Key('...')
{Screen}Keys.{name} // Keys ã¯ã©ã¹ã®ãã¿ãŒã³
Step 2-3: äžè¶³ Key ã®ç¹å®
仿§æžã®æäœã¹ãããã§å¿ èŠã ãããŸã Key ãä»äžãããŠããªãèŠçŽ ãç¹å®ããã
ã以äžã®èŠçŽ ã« Key ãäžè¶³ããŠããŸãïŒ
ç»é¢: LoginScreen (lib/ui/auth/login_screen.dart)
â ïž ã¡ãŒã«ã¢ãã¬ã¹å
¥åãã£ãŒã«ã â LoginKeys.emailField æšå¥š
â ïž ãã¹ã¯ãŒãå
¥åãã£ãŒã«ã â LoginKeys.passwordField æšå¥š
â
ãã°ã€ã³ãã¿ã³ â æ¢å Key ãã
Key ã远å ããŸããïŒïŒè¿œå ããå ŽåãKeys ã¯ã©ã¹ãçæããŸãïŒã
ããã§ãŠãŒã¶ãŒã®åçãåŸ ã€ã
Step 2-4: Key ã®è¿œå ïŒæ¿èªãããå ŽåïŒ
{screen}_keys.dartãã¡ã€ã«ãçæïŒãŸãã¯æŽæ°ïŒ- 察象 Widget ã«
key: {Screen}Keys.{name}ã远å - 倿Žå·®åããŠãŒã¶ãŒã«è¡šç€º
ã©ãããŒãŠã£ãžã§ããã® Key äŒææŠç¥:
super.keyãããã©ãããŒãŠã£ãžã§ããã«ã¯çŽæ¥ Key ãä»äžããCustomTextFormField( key: LoginKeys.driverIdPart1Field, // super.key ãããããçŽæ¥ä»äžå¯èœ controller: idPart1Controller, )super.keyããªãã©ãããŒã«ã¯KeyedSubtreeã§ã©ãããã- Page Object åŽã§ã¯
find.descendantãã¿ãŒã³ã䜿çšããã©ãããŒã® Key ããå éšã®EditableTextãç¹å®ãã
Phase 3: ãã¹ãã³ãŒãçæ
Step 3-1: Page Object ã®çæ
ç»é¢ããšã« Page Object ã¯ã©ã¹ãçæããã
詳现㯠references/page-object-pattern.md ãåç
§ã
Page Object ã¯ã©ã¹ã®åœåèŠå:
- åºæ¬åœ¢:
{Screen}PageObjectïŒãŠã£ãžã§ããã¯ã©ã¹åãšã®è¡çªåé¿ïŒ- äŸ:
LoginPageãŠã£ãžã§ãã âLoginPageObjectãã¹ãã¯ã©ã¹ - äŸ:
MyPagePageãŠã£ãžã§ãã âMyPagePageObjectãã¹ãã¯ã©ã¹
- äŸ:
- äŸå€: ãŠã£ãžã§ããã¯ã©ã¹åãšè¡çªããªãå Žåã¯
{Screen}Pageã§ãããïŒäŸ:AuthWallPageïŒ
ã¹ã¯ããŒã«å¯Ÿå¿ãã¿ãŒã³:
- ç»é¢å€èŠçŽ ãžã®ã¢ã¯ã»ã¹ã«ã¯
scrollUntilVisibleã䜿çšãã - ãã€ããŒãžã®ãã°ã¢ãŠããã¿ã³ãªã©ãç»é¢äžéšã®èŠçŽ ã察象
- Page Object å ã§ã¹ã¯ããŒã«åŠçãã«ãã»ã«åãã
pumpAndSettle ã¿ã€ã ã¢ãŠã調æŽ:
- API éä¿¡ã䌎ãæäœïŒãã°ã€ã³çïŒã§ã¯
Duration(seconds: 10)以äžãèšå® - èªèšŒãããŒå
šäœã®ã¿ã€ã ã¢ãŠãã¯
Duration(seconds: 15)ãæšå¥š
çæãã¡ã€ã«:
integration_test/page_objects/login_page_object.dart
integration_test/page_objects/home_page.dart
integration_test/page_objects/my_page_page_object.dart
Step 3-2: ã·ããªãªãã¹ãã®çæ
仿§æžã®æé ã 1:1 ã§ Dart ãã¹ãã³ãŒãã«å€æããã
詳现㯠references/test-template.md ãåç
§ã
çæãã¡ã€ã«:
integration_test/scenarios/st_auth_001_test.dart
Step 3-3: ãã¹ããã«ããŒã®çæïŒååã®ã¿ïŒ
å ±éã®ã»ããã¢ããã»ãã£ã¢ããŠã³åŠçãçæããã
çæãã¡ã€ã«:
integration_test/helpers/test_helper.dart
integration_test/helpers/app_launcher.dart
Phase 4: ãããã³ã°ã¬ããŒãçæ
仿§ã¹ããããšã³ãŒãã®å¯Ÿå¿è¡šãçæããã ããã人éã®ã¬ãã¥ãŒãã€ã³ãã
詳现㯠references/mapping-report.md ãåç
§ã
# ãããã³ã°ã¬ããŒã: ST-AUTH-001
| # | 仿§ã¹ããã | çæã¢ã¯ã·ã§ã³ | Key | ç¶æ
|
|---|------------|-------------|-----|------|
| 1 | ãã°ã€ã³ç»é¢ã衚瀺 | pumpAndSettle() | LoginKeys.screen | â
KeyäžèŽ |
| 2 | ã¡ãŒã«ã¢ãã¬ã¹ãå
¥å | enterText(LoginKeys.emailField, '...') | LoginKeys.emailField | â
KeyäžèŽ |
| 3 | ãã¹ã¯ãŒããå
¥å | enterText(LoginKeys.passwordField, '...') | LoginKeys.passwordField | â
KeyäžèŽ |
| 4 | ãã°ã€ã³ãã¿ã³ãã¿ãã | tap(LoginKeys.loginButton) | LoginKeys.loginButton | â
KeyäžèŽ |
| 5 | ããŒã ç»é¢ã衚瀺ããã | expect(find.byKey(HomeKeys.screen)) | HomeKeys.screen | â ïž Keyæšå® |
| 6 | äºçŽãã¿ã³ãã¿ãã | tap(HomeKeys.reserveButton) | HomeKeys.reserveButton | â Key該åœãªã |
## å€å®åºæº
- â
KeyäžèŽ: Keys ã¯ã©ã¹ã«å®çŸ©æžã¿ã® Key ãšå®å
šäžèŽ
- â ïž Keyæšå®: ç»é¢ã³ãŒãããæšå®ãã KeyïŒèŠç¢ºèªïŒ
- â Key該åœãªã: 察å¿ãã Key ãèŠã€ãããªãïŒKey 远å ãå¿
èŠïŒ
çæãã¡ã€ã«: integration_test/reports/st_auth_001_mapping.md
Phase 5: 確èªãšåºå
çæç©äžèЧããŠãŒã¶ãŒã«æç€ºããã
ã以äžã®ãã¡ã€ã«ãçæããŸããïŒ
Keys ã¯ã©ã¹:
- lib/ui/auth/login_keys.dart (æ°èŠ)
- lib/ui/home/home_keys.dart (æ°èŠ)
Page Objects:
- integration_test/page_objects/login_page.dart
- integration_test/page_objects/home_page.dart
ãã¹ãã³ãŒã:
- integration_test/scenarios/st_auth_001_test.dart
ãããã³ã°ã¬ããŒã:
- integration_test/reports/st_auth_001_mapping.md
ãããã³ã°ã¬ããŒãã確èªããŠãã ããã
â ããŒã¯ã®é
ç®ã¯ Key ã®è¿œå ãå¿
èŠã§ãã
â ïž ããŒã¯ã®é
ç®ã¯ Key ã®åŠ¥åœæ§ã確èªããŠãã ãããã
ã¬ãŒãã¬ãŒã«ã®åé¢åå
ã¢ãµãŒã·ã§ã³ïŒæåŸ çµæïŒ
- 仿§æžããå°åºãããã³ãŒãã®å®è£ ããã¯å°åºããªãã
- 仿§æžã«ãããŒã ç»é¢ã衚瀺ãããããšããã°ã
expect(find.byKey(HomeKeys.screen), findsOneWidget)ãçæã - ã³ãŒãã«
Navigator.push(HomeScreen())ããã£ãŠããããã¯ã¢ãµãŒã·ã§ã³ã®æ ¹æ ã«ããªãã
æäœæé
- 仿§æž + ã³ãŒãã® Key æ¢çŽ¢ããå°åºããã
- 仿§æžã®ãã¡ãŒã«ã¢ãã¬ã¹ãå
¥åãâ ã³ãŒããã
LoginKeys.emailFieldãæ¢çŽ¢ âenterTextãçæã
åçæããªã·ãŒ
| ç¶æ³ | å¯Ÿå¿ |
|---|---|
| ãã¹ã倱æïŒã³ãŒããã°ïŒ | ã³ãŒããä¿®æ£ããããã¹ãã¯æ£ããã |
| 仿§å€æŽ | ãã¹ããåçæããã仿§ãæ£ããã |
| UI ãªãã¡ã¯ã¿ãªã³ã°ïŒKey 倿ŽãªãïŒ | ãã¹ãã¯ãã®ãŸãŸåãã |
| UI ãªãã¡ã¯ã¿ãªã³ã°ïŒKey 倿ŽããïŒ | Keys ã¯ã©ã¹ãæŽæ°ãããã¹ããåçæã |
| æ°ç»é¢è¿œå | æ°ãã仿§ãæžãããã¹ããçæã |
ãã¡ã€ã«æ§æèŠçŽ
project/
âââ lib/
â âââ ui/
â âââ auth/
â â âââ login_screen.dart
â â âââ login_keys.dart â Keys ã¯ã©ã¹
â âââ home/
â âââ home_screen.dart
â âââ home_keys.dart â Keys ã¯ã©ã¹
âââ integration_test/
â âââ page_objects/ â Page ObjectïŒç»é¢ããšïŒ
â â âââ login_page.dart
â â âââ home_page.dart
â âââ scenarios/ â ã·ããªãªãã¹ãïŒä»æ§ãš1:1ïŒ
â â âââ st_auth_001_test.dart
â â âââ st_rsv_001_test.dart
â âââ reports/ â ãããã³ã°ã¬ããŒã
â â âââ st_auth_001_mapping.md
â â âââ st_rsv_001_mapping.md
â âââ helpers/ â å
±éãã«ããŒ
â âââ test_helper.dart
â âââ app_launcher.dart
âââ test_specs/ â ãã¹ã仿§æžïŒåèé
眮ïŒ
âââ ç·å詊éšé
ç®æž(Ph1).xlsx
Key èŠçŽ
詳现㯠references/key-convention.md ãåç
§ã
ã¯ã€ãã¯ãªãã¡ã¬ã³ã¹
| é ç® | èŠçŽ |
|---|---|
| ã¯ã©ã¹å | {Screen}KeysïŒäŸ: LoginKeysïŒ |
| Key å€ | {screen}_{role}_{name}ïŒäŸ: login_field_emailïŒ |
| 察象 | ã¿ããã»å ¥åã»æ€èšŒããèŠçŽ + ç»é¢èªäœ |
| ãã¡ã€ã« | {screen}_keys.dartïŒç»é¢ãšåãã£ã¬ã¯ããªïŒ |
Role äžèЧ
| role | çšé | äŸ |
|---|---|---|
screen |
ç»é¢èªäœ | login_screen |
field |
ããã¹ãå ¥å | login_field_email |
button |
ãã¿ã³ | login_button_submit |
text |
ããã¹ã衚瀺 | home_text_welcome |
list |
ãªã¹ã | home_list_reservations |
item |
ãªã¹ãã¢ã€ãã | home_item_reservation |
dialog |
ãã€ã¢ãã° | login_dialog_error |
icon |
ã¢ã€ã³ã³ | home_icon_notification |
ãã¹ã仿§æžã®æ³å®æ§é
Excel ã«ã©ã æ§æ
| å | å 容 | AI ã§ã®å©çš |
|---|---|---|
| D: 詊éšé ç®ID | ST-AUTH-001 ç |
ãã¹ããã¡ã€ã«åã»é¢æ°å |
| E: 詊éšå 容 | ã·ããªãªã®èª¬æ | ãã¹ãã® description |
| F: åææ¡ä»¶ | ãã°ã€ã³ç¶æ ãããŒã¿ç | setUp / ã¢ãã¯èšå® |
| G: æé | çªå·ä»ãæäœã¹ããã | Page Object çµç±ã®æäœã³ãŒã |
| H: æåŸ çµæ | çªå·ä»ãæåŸ å€ | ã¢ãµãŒã·ã§ã³ïŒä»æ§æžç±æ¥ïŒ |
ãã¹ãã«ããŽãª
| ã«ããŽãª | ID ç¯å² | å 容 |
|---|---|---|
| èªèšŒç³» | ST-AUTH-001ã005 | ãã°ã€ã³ãçäœèªèšŒããªãŒããã°ã€ã³ãã»ãã·ã§ã³ |
| äºçŽç³» | ST-RSV-001ã004 | æ€çŽ¢ãçµã蟌ã¿ã倿Žããã£ã³ã»ã« |
| å©çšç³» | ST-USE-001ã002 | å©çšéå§ãçµäºãå»¶é·ãå¿ãç© |
| ãã€ããŒãž | ST-MYP-001 | èšå®ãè«æ±ãã¯ãŒãã³ |
| ãã«ã | ST-HLP-001 | FAQæ€çŽ¢ãç·æ¥é£çµ¡ |
泚æäºé
- åãã§ãŒãºã§ãŠãŒã¶ãŒã®ç¢ºèªãåŸ ã€ããšãå èµ°ã£ãŠå šçæããªãã
- ãããã³ã°ã¬ããŒãã® â é ç®ãããå Žåããã¹ãã³ãŒãçæåã« Key 远å ãææ¡ããããšã
- ã¢ãµãŒã·ã§ã³ã¯ä»æ§æžã®ã¿ããå°åºãããã³ãŒãã®å®è£ ãæ ¹æ ã«ããªãã
- æ¢åã® Widget ãã¹ãã unit ãã¹ãã«ã¯åœ±é¿ãäžããªãã
- çæã³ãŒãã¯æ¥æ¬èªã³ã¡ã³ãä»ãã§åºåããã
å®è¡ã¢ãŒã
åç¬å®è¡ïŒPoC åãïŒ
1ãã¹ãã±ãŒã¹ãé æ¬¡åŠçããå Žåã«äœ¿çšãPhase 0ã5 ã1ãšãŒãžã§ã³ãã鿬¡å®è¡ããã
ããŒã å®è¡ïŒæ¬çªåãïŒ
è€æ°ãã¹ãã±ãŒã¹ã®äžæ¬çæããå質éèŠã®å Žåã«äœ¿çšã
PLã»PGã»QA ã®3ããŒã«ã«åå²ããAgent Team ã§äžŠè¡äœæ¥ããã
詳现㯠references/agent-team-workflow.md ãåç
§ã
PLïŒèšèšïŒ: 仿§èªã¿åã + èšèšå€æ + æçµã¬ãã¥ãŒ
PGïŒå®è£
ïŒ: ã³ãŒãè§£æ + Key远å + ãã¹ãã³ãŒãçæ
QAïŒæ€èšŒïŒ: ãããã³ã°ã¬ããŒãçæ + æŽåæ§ãã§ãã¯
åç §ããã¥ã¡ã³ã
references/key-convention.md- Key èŠçŽã®è©³çްreferences/page-object-pattern.md- Page Object ãã¿ãŒã³ã®ãã³ãã¬ãŒãreferences/test-template.md- ãã¹ãã³ãŒããã³ãã¬ãŒãreferences/mapping-report.md- ãããã³ã°ã¬ããŒãã®ãã©ãŒãããreferences/poc-example.md- PoC å®è¡äŸïŒST-AUTH-001 / ic_card ãããžã§ã¯ãïŒreferences/real-project-patterns.md- å®ãããžã§ã¯ãã§çºèŠããããã¿ãŒã³éreferences/agent-team-workflow.md- Agent Team ã¯ãŒã¯ãããŒïŒPL/PG/QA ããŒã«åå²ïŒ
