Prompt file imported from sho-kawasaki-dd/gem-read (
.github/prompts/plan-multiRectangleSelection.prompt.md). Copyright stays with the author.
以äžã®å®è£ èšç»ãšèšèšæ¹éïŒSteps, DecisionsïŒã«å³å¯ã«åŸã£ãŠãã³ãŒãã®å®è£ ããã³ä¿®æ£ãé æ¬¡é²ããŠãã ãããäžæç¹ãèšç»ã®ççŸãèŠã€ãã£ãå Žåã¯å®è£ åã«è³ªåããŠãã ããã
Plan: Multi-Rectangle Selection
è€æ°ç©åœ¢éžæã¯ã1ä»¶ã®éžæçµæãäžæžãããçŸè¡èšèšããéžæã¹ãããã®éåãæ±ãèšèšã«åŒãäžããŠå®è£ ãããéåžžãã©ãã°ã¯å šçœ®æãCtrl+ãã©ãã°ã¯æ«å°Ÿè¿œå ãEscã§å šæ¶å»ãšããMainPresenter ãéžæé ã»éåææœåºã»ç Žæ£å€å®ãäžå 管çãããView ã¯è€æ°ãã€ã©ã€ããšçªå·ãããžãæç»ããSidePanel ã¯çªå·ä»ãäžèЧãšé£çµãã¬ãã¥ãŒã衚瀺ãããAI è§£æã«ã¯éžæé ã§çµåããããã¹ããšå šç»åã1åã§éãã
Steps
- Phase 1: å¥çŽãšç¶æ ã¢ãã«ãå®çŸ©ããããŸã src/pdf_epub_reader/dto/document_dto.py ã«ãåäžã® SelectionContent ã¯ç¶æãããŸãŸãè€æ°éžæãè¡šãæ°DTOã远å ãããæ³å®ã¯ãå éšå®å®IDã»è¡šç€ºçªå·ã»ããŒãžçªå·ã»ç©åœ¢ã»èªåç¶æ ã»æœåºæžã¿ããã¹ãã»ãµã ãã€ã«æç¡ãæã€éžæã¹ãããDTOãšãéžæäžèЧã®ã¹ãããã·ã§ããDTOã§ãããããã«åãã㊠src/pdf_epub_reader/interfaces/view_interfaces.py ã® IMainView ãš ISidePanelView ãæ¡åŒµããéåžžéžæã远å éžæãã View ããéç¥ã§ããããã«ããè€æ°ãã€ã©ã€ãæç»ãçªå·ä»ãäžèŠ§è¡šç€ºãåå¥åé€ïŒã³ãŒã«ããã¯çµç±ã§ã®äŒéïŒãå šæ¶å»ã®å¥çŽãæç€ºããã
- Phase 2: ææžãã¥ãŒã®å ¥åãšãªãŒããŒã¬ã€ãæ¡åŒµãããdepends on 1ãsrc/pdf_epub_reader/views/main_window.py ã® _DocumentGraphicsView ã§ Ctrl 修食ä»ããã©ãã°ãæ€åºããã³ãŒã«ããã¯ã«è¿œå ã¢ãŒããæž¡ããEsc ã·ã§ãŒãã«ããã MainWindow åŽã«è¿œå ããPresenter ãžå šæ¶å»èŠæ±ãæž¡ãããã€ã©ã€ãã¯åäžã® _highlight_item ããããè€æ°ã®ç©åœ¢ã¢ã€ãã ãšçªå·ãããžãä¿æããèŸæžæ§é ã«çœ®ãæããã衚瀺çªå·ã¯æ¯å 1,2,3... ã«è©°ãçŽããå éšIDã¯äžå€ãšãããçªå·ã¯ç©åœ¢äžå€®ã§ã¯ãªãå·Šäžå¯ãã®å°åãããžã§æç»ããå 容ç©ãé ããããªãããã«ããããŸãããºãŒã ããªãµã€ãºæã«ã¯ãä¿æããŠããå šãŠã®ç©åœ¢ã¢ã€ãã ãšçªå·ãããžã«å¯ŸããŠäžæ¬ã§åèšç®ã»åé 眮ãè¡ãã«ãŒããåŠçã«çµã¿èŸŒãã
- Phase 3: MainPresenter ã«è€æ°éžæã®ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ãå®è£ ãããdepends on 1 and 2ãsrc/pdf_epub_reader/presenters/main_presenter.py ã§ãéžæã¹ããããé åºä»ãã§ä¿æãã OrderedDict çžåœã®ç¶æ ã衚瀺çªå·åèšç®ããã¡ã€ã«åæ¿æã®å šæ¶å»ãéåžžéžææã®å šçœ®æãCtrl éžææã®æ«å°Ÿè¿œå ãå®è£ ãããåãã©ãã°åçæã«ã¯å³åº§ã«ç©ºã¹ãããã確ä¿ã㊠View ãš SidePanel ã« å ã« åæ ãããã®åŸã« extract_content ãéåæéå§ãããçµæã®å®äºé ãååŸããŠã衚瀺é ãä¿ãŠããããã¹ãããäœææç¹ã§é çªãåºå®ããçµæã¯è©²åœã¹ãããã ãåãããéåžžéžæã§æ¢åéžæãæšãŠãåŸãææžåæ¿åŸã«é å»¶çµæãæ»ãã±ãŒã¹ãé²ããããéžæäžä»£ããŒã¯ã³ãæãããå€ãäžä»£ã®å®äºçµæã¯ç Žæ£ããã
- Phase 4: SidePanel ã®è€æ°éžæUIãå®è£ ãããdepends on 1 and parallel with 3 after contracts are readyãsrc/pdf_epub_reader/views/side_panel_view.py ã«ãçŸåšã®åäžãã¬ãã¥ãŒé åããçªå·ä»ãäžèЧãšé£çµãã¬ãã¥ãŒã®2å±€ã«åç·šæãããäžèЧã«ã¯åéžæã®çªå·ãããŒãžæ å ±ãçãæ¬æãã¬ãã¥ãŒãèªåäžè¡šç€ºãåå¥åé€ãã¿ã³ã眮ããæ¢åã®ãµã ãã€ã«è¡šç€ºã¯ãéžæããšã®å°åãµã ãã€ã«ã«ç§»ããé£çµãã¬ãã¥ãŒã¯ AI ã«éãæçµããã¹ãããã®ãŸãŸèŠããèªã¿åãå°çšé åãšãããå šæ¶å»ãã¿ã³ããã®ã»ã¯ã·ã§ã³ã«çœ®ããPhase 6.5 ã§å ¥ã£ãŠãã CollapsibleSection ãã¿ãŒã³ã¯ãã®ãŸãŸåå©çšããéžæäžèЧã»ã¯ã·ã§ã³å šäœãæãããããããã«ãããããã«ã瞊ã¹ããŒã¹ã®å§è¿«ãé²ããããAIåç衚瀺é åã«ã CollapsibleSection ãé©çšããŠæãããããããã«ãããUIã®æè»æ§ãé«ããããããããã®ã»ã¯ã·ã§ã³éã«ã¯ QSplitter ãå°å ¥ãããŠãŒã¶ãŒããã©ãã°ã§èªç±ã«è¡šç€ºé åã®ãµã€ãºã調æŽã§ããããã«ããããŸããå©äŸ¿æ§åäžã®ããã®ããŒãã€ã³ããšããŠãéžæäžèЧããã¯ã¹ã®æãããã¿ã "Ctrl+Shift+T"ãAIåçæ¬ã®æãããã¿ã "Ctrl+Shift+I" ã§ãã°ã«ã§ããããã«ã·ã§ãŒãã«ãããèšå®ããã
- Phase 5: PanelPresenter ã§ AI å ¥åãè€æ°éžæå¯Ÿå¿ã«ãããdepends on 3 and 4ãsrc/pdf_epub_reader/presenters/panel_presenter.py ã§ _selected_text ãš _selected_content ã®åæ°ç¶æ ããããéžæäžèЧã®ã¹ãããã·ã§ãããåãåã圢ã«å€æŽããã翻蚳ãšã«ã¹ã¿ã ããã³ããã®äž¡æ¹ã§ãéžæé ã«é£çµããæ¬æã AnalysisRequest.text ã«å ¥ããåéžæã® cropped_image ãé çªéãã« AnalysisRequest.images ã«å ¥ãããé£çµãã©ãŒãããã¯ãå¢çãèªããããã« Selection 1 / Page N ã®èŠåºããšç©ºè¡ãå«ãæç€ºçåºåãã«ãããããã«ãããé·ã蚌æã®æçãçµåããŠã LLM ãã»ã°ã¡ã³ãå¢çãèŠå€±ãã«ãããããã¢ãã«æªèšå®æã API äŸå€åŠçã®æ¢ååå²ã¯ãã®ãŸãŸç¶æããã
- Phase 6: åå¥åé€ãšå šæ¶å»ã®é ç·ãä»äžãããdepends on 3 and 4ãSidePanel ã®åé€ã€ãã³ãïŒon_selection_delete_requestedçïŒã MainPresenter ã§è³Œèªããé ç·ãç¹ããselection_id åäœã®åé€åŠçãšå šæ¶å»åŠçã远å ããView ã®ãªãŒããŒã¬ã€ãš SidePanel ã®äžèЧãåžžã«åãã¹ãããã·ã§ããããåæç»ãããåé€åŸã¯è¡šç€ºçªå·ãè©°ãçŽããé£çµãã¬ãã¥ãŒãš AI å ¥åå ãåèšç®ãããéåžžãã©ãã°ã§ã®å šçœ®æãEsc å šæ¶å»ãopen_file ã®å é ã§ã®å šæ¶å»ãèªã¿åã倱æã¹ãããã®æ±ããããã§çµ±äžãããèªã¿åã倱ææã¯ã¹ãããèªäœã¯æ®ããæ¬æã«å€±æè¡šç€ºãåºãããå³åé€ãããã®å®è£ ã¯ãæ¢å®ã§ã¯å€±æè¡šç€ºãçãæ®ããŠãŠãŒã¶ãŒãåé€ã§ããããã«ããã
- Phase 7: ãã¹ããšã¢ãã¯ãæŽæ°ãããdepends on 1 through 6ãtests/mocks/mock_views.py ã® MockMainView ãš MockSidePanelView ã«è€æ°éžæçšAPIãš simulate helpers ã远å ãããtests/test_presenters/test_main_presenter.py ã§ã¯ãéåžžéžæã®å šçœ®æãCtrl 远å ãã¹ãããå è¡è¡šç€ºãäžä»£ããŒã¯ã³ã«ããå€ãçµæç Žæ£ãåé€ãå šæ¶å»ãopen_file æã¯ãªã¢ã10ä»¶è¶ ã®æ³šæè¡šç€ºãæ€èšŒãããtests/test_presenters/test_panel_presenter.py ã§ã¯ãè€æ°éžæã®é£çµããã¹ãçæãç»åé åã®é åºãåé€åŸã®åèšç®ãã¢ãã«æªèšå®æã®ææ¢ãæ€èšŒãããå¿ èŠã«å¿ã㊠tests/test_models ã¯å€æŽãããDocumentModel ãåäžç©åœ¢æœåºè²¬åã®ãŸãŸä¿ãããŠããããšã確èªããã
- Phase 8: æåæ€èšŒãè¡ããdepends on 7ãPDF ãš EPUB ã®äž¡æ¹ã§ãéåžžãã©ãã°ãCtrl+ãã©ãã°ãEscãåå¥åé€ãå šæ¶å»ããºãŒã 倿ŽåŸã®ãªãŒããŒã¬ã€ç¶æãããŒãžè·šãéžæé ã10ä»¶è¶ ã®æ³šæè¡šç€ºãAI éä¿¡çµæã®é åºãæ°åŒãç»åãå«ãéžæã®ãµã ãã€ã«è¡šç€ºã確èªããã
Relevant files
- src/pdf_epub_reader/dto/document_dto.py â SelectionContent ãç¶æãã€ã€ãè€æ°éžæã¹ããããšäžèЧã¹ãããã·ã§ããã®DTOã远å ããã
- src/pdf_epub_reader/interfaces/view_interfaces.py â IMainView ãš ISidePanelView ã«è¿œå éžæéç¥ãè€æ°ãªãŒããŒã¬ã€æç»ãäžèŠ§æŽæ°ãåå¥åé€ãå šæ¶å»ã®å¥çŽã远å ããã
- src/pdf_epub_reader/presenters/main_presenter.py â éžæäžä»£ç®¡çã远å ãšçœ®æã®åå²ãéåæå®äºã®å·®ã蟌ã¿ãåé€ãšå šæ¶å»ãææžåæ¿æã®ã¯ãªã¢ãå®è£ ããã
- src/pdf_epub_reader/presenters/panel_presenter.py â è€æ°éžæããé£çµæ¬æãšç»åé åãæ§ç¯ããSidePanel ã®äžèЧãšé£çµãã¬ãã¥ãŒãæŽæ°ããã
- src/pdf_epub_reader/views/main_window.py â Ctrl 修食æ€åºãEsc ã·ã§ãŒãã«ãããè€æ°ãã€ã©ã€ããçªå·ãããžãåæç»çšã¡ãœãããå®è£ ããã
- src/pdf_epub_reader/views/side_panel_view.py â çªå·ä»ãäžèЧãåå¥åé€ãå šæ¶å»ãé£çµãã¬ãã¥ãŒãèªåäžè¡šç€ºãå®è£ ããã
- tests/mocks/mock_views.py â æ°ãã View å¥çŽã«å¯Ÿå¿ããã¢ãã¯ãš simulate helpers ã远å ããã
- tests/test_presenters/test_main_presenter.py â éžæç¶æ é·ç§»ãšéåæé åºã®ãã¹ãã远å ããã
- tests/test_presenters/test_panel_presenter.py â é£çµæ¬æãç»åé åºãåé€åŸåèšç®ã®ãã¹ãã远å ããã
Verification
- pytest tests/test_presenters/test_main_presenter.py tests/test_presenters/test_panel_presenter.py
- pytest tests/test_models/test_document_model.py
- æåã§ PDF ãéããéåžžãã©ãã°ã§åç¬éžæãCtrl+ãã©ãã°ã§è¿œå ãEsc ã§å šæ¶å»ã§ããããšã確èªããã
- 3件以äžè¿œå ããŠçªå·ã 1,2,3 ãšè¡šç€ºãããéäžãåé€ãããšèŠãç®ã®çªå·ã ããè©°ãçŽãããããšã確èªããã
- 远å é ãš AI ã«éãããé£çµé ãäžèŽããããšãããµã€ãããã«ã®é£çµãã¬ãã¥ãŒãšå®éã®è§£æçµæã§ç¢ºèªããã
- 1ä»¶ç®ã®æœåºäžã« 2ä»¶ç®ãš 3ä»¶ç®ã远å ããŠããäžèЧé ã厩ããã眮æãææžåæ¿åŸã«å€ãçµæãæ··å ¥ããªãããšã確èªããã
- æ°åŒãç»åãå«ãéžæã§ãåéžæã®ç»åã AnalysisRequest.images ã«é çªéãå ¥ãããšã presenter ãã¹ãã§ç¢ºèªããã
Decisions
- AI è§£æå¯Ÿè±¡ã¯ãå šéžæããŠãŒã¶ãŒãéžãã é ã«çµåããŠ1åã§éããAIãžéä¿¡åŸãæåã§ãªã»ãã(Escç)ã眮æãã©ãã°ããããŸã§éžæç¶æ ã¯ä¿æããã
- éåžžãã©ãã°ã¯å šçœ®æãCtrl+ãã©ãã°ã¯è¿œå ãEsc ã§å šæ¶å»ããã
- ãªãŒããŒã¬ã€ã®èŠãç®çªå·ã¯åé€åŸã« 1,2,3... ãšè©°ãçŽãããå éšIDã¯äžå€ã«ããã
- SidePanel 㯠çªå·ä»ãäžèЧ + é£çµãã¬ãã¥ãŒ ãæã¡ãåå¥åé€ãšå šæ¶å»ãæäŸãããéžæäžèЧãšAIåçæ¬ã¯ãããã CollapsibleSection ãšããéã« QSplitter ãé 眮ããŠæè»ã«ãµã€ãºèª¿æŽå¯èœã«ããããã°ã«ã®ããã®ããŒãã€ã³ãïŒCtrl+Shift+T ã§éžæäžèЧãCtrl+Shift+I ã§AIåçæ¬ïŒãèšå®ããã
- éžææ°ã¯äžéãªããšãã10ä»¶è¶ ã§ãAPIããŒã¯ã³å¶éãåŠçé床äœäžã®æãããããŸãããšãã£ãæšã®æ³šæè¡šç€ºã ãåºãã
- æœåºã¯çªå·æ ãå ã«ç¢ºä¿ããèªã¿åãäžè¡šç€ºãåºããäžã§ãå®äºããã¹ãããããäžèº«ã ãåããã
Further Decisions
- é£çµãã©ãŒãããã¯ãæ¥æ¬èªã® éžæ 1 / ããŒãž N ã«ããã
- èªã¿åã倱æã¹ãããã¯çããšã©ãŒè¡šç€ºä»ãã§æ®ããèªååé€ã«ãããšããŠãŒã¶ãŒã äœã倱æããã ã远ããªããªãããã
- çªå·ãããžã®ãµã€ãºãšéæåºŠã¯ãæ°åŒé åãé ããããªãããšãåªå ããåæå€ã¯æ§ããã«èšå®ããŠæå確èªã§åŸ®èª¿æŽãã.