From 13d6159468ce32ad0882d7da47e257184e811afc Mon Sep 17 00:00:00 2001 From: mannaandpoem <1580466765@qq.com> Date: Sun, 4 Feb 2024 17:23:00 +0800 Subject: [PATCH 1/7] 1. remove CODE_PLAN_AND_CHANGE_FILENAME 2. add code_plan_and_change_doc to _new_code_actions --- metagpt/actions/write_code.py | 14 +++------- metagpt/actions/write_code_review.py | 34 ++++++++++--------------- metagpt/const.py | 1 - metagpt/roles/engineer.py | 38 ++++++++++++++++++++-------- metagpt/schema.py | 3 +-- 5 files changed, 46 insertions(+), 44 deletions(-) diff --git a/metagpt/actions/write_code.py b/metagpt/actions/write_code.py index 0b86ac1bb..feb15657d 100644 --- a/metagpt/actions/write_code.py +++ b/metagpt/actions/write_code.py @@ -23,11 +23,7 @@ from tenacity import retry, stop_after_attempt, wait_random_exponential from metagpt.actions.action import Action from metagpt.actions.project_management_an import REFINED_TASK_LIST, TASK_LIST from metagpt.actions.write_code_plan_and_change_an import REFINED_TEMPLATE -from metagpt.const import ( - BUGFIX_FILENAME, - CODE_PLAN_AND_CHANGE_FILENAME, - REQUIREMENT_FILENAME, -) +from metagpt.const import BUGFIX_FILENAME, REQUIREMENT_FILENAME from metagpt.logs import logger from metagpt.schema import CodingContext, Document, RunCodeResult from metagpt.utils.common import CodeParser @@ -98,8 +94,6 @@ class WriteCode(Action): bug_feedback = await self.repo.docs.get(filename=BUGFIX_FILENAME) coding_context = CodingContext.loads(self.i_context.content) test_doc = await self.repo.test_outputs.get(filename="test_" + coding_context.filename + ".json") - code_plan_and_change_doc = await self.repo.docs.code_plan_and_change.get(filename=CODE_PLAN_AND_CHANGE_FILENAME) - code_plan_and_change = code_plan_and_change_doc.content if code_plan_and_change_doc else "" requirement_doc = await self.repo.docs.get(filename=REQUIREMENT_FILENAME) summary_doc = None if coding_context.design_doc and coding_context.design_doc.filename: @@ -111,7 +105,7 @@ class WriteCode(Action): if bug_feedback: code_context = coding_context.code_doc.content - elif code_plan_and_change: + elif self.config.inc: code_context = await self.get_codes( coding_context.task_doc, exclude=self.i_context.filename, project_repo=self.repo, use_inc=True ) @@ -122,10 +116,10 @@ class WriteCode(Action): project_repo=self.repo.with_src_path(self.context.src_workspace), ) - if code_plan_and_change: + if self.config.inc: prompt = REFINED_TEMPLATE.format( user_requirement=requirement_doc.content if requirement_doc else "", - code_plan_and_change=code_plan_and_change, + code_plan_and_change=str(coding_context.code_plan_and_change_doc), design=coding_context.design_doc.content if coding_context.design_doc else "", task=coding_context.task_doc.content if coding_context.task_doc else "", code=code_context, diff --git a/metagpt/actions/write_code_review.py b/metagpt/actions/write_code_review.py index da636eb36..ac6fe7045 100644 --- a/metagpt/actions/write_code_review.py +++ b/metagpt/actions/write_code_review.py @@ -13,7 +13,7 @@ from tenacity import retry, stop_after_attempt, wait_random_exponential from metagpt.actions import WriteCode from metagpt.actions.action import Action -from metagpt.const import CODE_PLAN_AND_CHANGE_FILENAME, REQUIREMENT_FILENAME +from metagpt.const import REQUIREMENT_FILENAME from metagpt.logs import logger from metagpt.schema import CodingContext from metagpt.utils.common import CodeParser @@ -149,29 +149,21 @@ class WriteCodeReview(Action): use_inc=self.config.inc, ) - if not self.config.inc: - context = "\n".join( - [ - "## System Design\n" + str(self.i_context.design_doc) + "\n", - "## Task\n" + task_content + "\n", - "## Code Files\n" + code_context + "\n", - ] - ) - else: + ctx_list = [ + "## System Design\n" + str(self.i_context.design_doc) + "\n", + "## Task\n" + task_content + "\n", + "## Code Files\n" + code_context + "\n", + ] + if self.config.inc: requirement_doc = await self.repo.docs.get(filename=REQUIREMENT_FILENAME) - code_plan_and_change_doc = await self.repo.get(filename=CODE_PLAN_AND_CHANGE_FILENAME) - context = "\n".join( - [ - "## User New Requirements\n" + str(requirement_doc) + "\n", - "## Code Plan And Change\n" + str(code_plan_and_change_doc) + "\n", - "## System Design\n" + str(self.i_context.design_doc) + "\n", - "## Task\n" + task_content + "\n", - "## Code Files\n" + code_context + "\n", - ] - ) + insert_ctx_list = [ + "## User New Requirements\n" + str(requirement_doc) + "\n", + "## Code Plan And Change\n" + str(self.i_context.code_plan_and_change_doc) + "\n", + ] + ctx_list = insert_ctx_list + ctx_list context_prompt = PROMPT_TEMPLATE.format( - context=context, + context="\n".join(ctx_list), code=iterative_code, filename=self.i_context.code_doc.filename, ) diff --git a/metagpt/const.py b/metagpt/const.py index a1c650ce3..8fde31ed3 100644 --- a/metagpt/const.py +++ b/metagpt/const.py @@ -82,7 +82,6 @@ MESSAGE_ROUTE_TO_NONE = "" REQUIREMENT_FILENAME = "requirement.txt" BUGFIX_FILENAME = "bugfix.txt" PACKAGE_REQUIREMENTS_FILENAME = "requirements.txt" -CODE_PLAN_AND_CHANGE_FILENAME = "code_plan_and_change.json" DOCS_FILE_REPO = "docs" PRDS_FILE_REPO = "docs/prd" diff --git a/metagpt/roles/engineer.py b/metagpt/roles/engineer.py index 40ade2110..7037ca0b3 100644 --- a/metagpt/roles/engineer.py +++ b/metagpt/roles/engineer.py @@ -20,7 +20,6 @@ from __future__ import annotations import json -import os from collections import defaultdict from pathlib import Path from typing import Set @@ -32,7 +31,6 @@ from metagpt.actions.summarize_code import SummarizeCode from metagpt.actions.write_code_plan_and_change_an import WriteCodePlanAndChange from metagpt.const import ( CODE_PLAN_AND_CHANGE_FILE_REPO, - CODE_PLAN_AND_CHANGE_FILENAME, REQUIREMENT_FILENAME, SYSTEM_DESIGN_FILE_REPO, TASK_FILE_REPO, @@ -119,10 +117,10 @@ class Engineer(Role): dependencies = {coding_context.design_doc.root_relative_path, coding_context.task_doc.root_relative_path} if self.config.inc: - dependencies.add(os.path.join(CODE_PLAN_AND_CHANGE_FILE_REPO, CODE_PLAN_AND_CHANGE_FILENAME)) + dependencies.add(coding_context.code_plan_and_change_doc.root_relative_path) await self.project_repo.srcs.save( filename=coding_context.filename, - dependencies=dependencies, + dependencies=list(dependencies), content=coding_context.code_doc.content, ) msg = Message( @@ -215,11 +213,12 @@ class Engineer(Role): self.rc.todo.i_context.design_filename, self.rc.todo.i_context.task_filename, } + code_plan_and_change_filepath = Path(self.rc.todo.i_context.design_filename) await self.project_repo.docs.code_plan_and_change.save( - filename=self.rc.todo.i_context.filename, content=code_plan_and_change, dependencies=dependencies + filename=code_plan_and_change_filepath.name, content=code_plan_and_change, dependencies=dependencies ) await self.project_repo.resources.code_plan_and_change.save( - filename=Path(self.rc.todo.i_context.filename).with_suffix(".md").name, + filename=code_plan_and_change_filepath.with_suffix(".md").name, content=node.content, dependencies=dependencies, ) @@ -269,15 +268,24 @@ class Engineer(Role): dependencies = {Path(i) for i in await dependency.get(old_code_doc.root_relative_path)} task_doc = None design_doc = None + code_plan_and_change_doc = None for i in dependencies: if str(i.parent) == TASK_FILE_REPO: task_doc = await self.project_repo.docs.task.get(i.name) elif str(i.parent) == SYSTEM_DESIGN_FILE_REPO: design_doc = await self.project_repo.docs.system_design.get(i.name) + elif str(i.parent) == CODE_PLAN_AND_CHANGE_FILE_REPO: + code_plan_and_change_doc = await self.project_repo.docs.code_plan_and_change.get(i.name) if not task_doc or not design_doc: logger.error(f'Detected source code "{filename}" from an unknown origin.') raise ValueError(f'Detected source code "{filename}" from an unknown origin.') - context = CodingContext(filename=filename, design_doc=design_doc, task_doc=task_doc, code_doc=old_code_doc) + context = CodingContext( + filename=filename, + design_doc=design_doc, + task_doc=task_doc, + code_doc=old_code_doc, + code_plan_and_change_doc=code_plan_and_change_doc, + ) return context async def _new_coding_doc(self, filename, dependency): @@ -296,6 +304,7 @@ class Engineer(Role): for filename in changed_task_files: design_doc = await self.project_repo.docs.system_design.get(filename) task_doc = await self.project_repo.docs.task.get(filename) + code_plan_and_change_doc = await self.project_repo.docs.code_plan_and_change.get(filename) task_list = self._parse_tasks(task_doc) for task_filename in task_list: old_code_doc = await self.project_repo.srcs.get(task_filename) @@ -303,9 +312,18 @@ class Engineer(Role): old_code_doc = Document( root_path=str(self.project_repo.src_relative_path), filename=task_filename, content="" ) - context = CodingContext( - filename=task_filename, design_doc=design_doc, task_doc=task_doc, code_doc=old_code_doc - ) + if not code_plan_and_change_doc: + context = CodingContext( + filename=task_filename, design_doc=design_doc, task_doc=task_doc, code_doc=old_code_doc + ) + else: + context = CodingContext( + filename=task_filename, + design_doc=design_doc, + task_doc=task_doc, + code_doc=old_code_doc, + code_plan_and_change_doc=code_plan_and_change_doc, + ) coding_doc = Document( root_path=str(self.project_repo.src_relative_path), filename=task_filename, diff --git a/metagpt/schema.py b/metagpt/schema.py index ee194afbd..ff21baff0 100644 --- a/metagpt/schema.py +++ b/metagpt/schema.py @@ -37,7 +37,6 @@ from pydantic import ( ) from metagpt.const import ( - CODE_PLAN_AND_CHANGE_FILENAME, MESSAGE_ROUTE_CAUSE_BY, MESSAGE_ROUTE_FROM, MESSAGE_ROUTE_TO, @@ -419,6 +418,7 @@ class CodingContext(BaseContext): design_doc: Optional[Document] = None task_doc: Optional[Document] = None code_doc: Optional[Document] = None + code_plan_and_change_doc: Optional[Document] = None class TestingContext(BaseContext): @@ -473,7 +473,6 @@ class BugFixContext(BaseContext): class CodePlanAndChangeContext(BaseModel): - filename: str = CODE_PLAN_AND_CHANGE_FILENAME requirement: str = "" prd_filename: str = "" design_filename: str = "" From 04ba43d66d35e9d765a28e303c8c1dcd63495bbc Mon Sep 17 00:00:00 2001 From: mannaandpoem <1580466765@qq.com> Date: Wed, 7 Feb 2024 00:05:50 +0800 Subject: [PATCH 2/7] remove .gitignore to update zip file --- tests/data/incremental_dev_project/Gomoku.zip | Bin 94000 -> 25822 bytes .../dice_simulator_new.zip | Bin 56393 -> 16807 bytes .../number_guessing_game.zip | Bin 53764 -> 15150 bytes .../incremental_dev_project/pygame_2048.zip | Bin 63452 -> 20336 bytes .../simple_add_calculator.zip | Bin 56546 -> 15141 bytes .../incremental_dev_project/snake_game.zip | Bin 108388 -> 19434 bytes .../incremental_dev_project/word_cloud.zip | Bin 12752 -> 12634 bytes 7 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/data/incremental_dev_project/Gomoku.zip b/tests/data/incremental_dev_project/Gomoku.zip index 23649565ab58c4b07ee08680cb20370d933c1b39..a110ccdd227458dcd40b9ee242418da2184c60af 100644 GIT binary patch delta 555 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 diff --git a/tests/data/incremental_dev_project/dice_simulator_new.zip b/tests/data/incremental_dev_project/dice_simulator_new.zip index 4752ab4c55876bdb8d17a6ebc34aa7e2cf006786..377eaa4f52799a9c2b28864f95469667a6b2e7f0 100644 GIT binary patch delta 528 zcmX|;Pe_w-7{}i|N;KJiz3-&0#@ah(wDp7L7D=cj$PR&Kf)@pm4n>zhZ^AH==-OfQ zg(7jK2PcsQQT|DVc2TgCoA2B|nR@ZGOM-L~`|bC--9Df1^W}kuXKSTl{uF^X*I*J(6XbhOFOOf)G5>ri@|Bi z#0N$@?VC7lgy^bE7LJT=dhU@J&9>7Y6DwJUiIR$?tee<1Ijv-SY1t=G$IvdP<0{_9 zsbPcNQ1N21>4HyDlvoS2qzjWDR9JICTCJ*%fgGn36BD`n6umCfM6MYu-$~^gQY+Ig zyvheD6p(r^5x}p42lfJ^&7h3*PbwZ3IB7S})h`;H`nc4_Vu;?DI5l$_dfrq0ilvOd z-<^ohG$EX{V!g=89~S)%xxA~y$Q=>t!)WO)J*lA`lk=KbVIKGFCnL2D+8$?q#jiwd Lit?yU9IN~X#i84@ delta 35077 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 diff --git a/tests/data/incremental_dev_project/number_guessing_game.zip b/tests/data/incremental_dev_project/number_guessing_game.zip index 7bbe077134c4a2ba4c841af5c5f086bffb24618c..9d192c1e60e5349af5a9d4a1928975a5c4fae238 100644 GIT binary patch delta 560 zcmYk3%S!@L7{#YAQp%V{qb!+9n&|?uTx-&VWcXfW}p6@$w@6u7>>16l~XVIebW_%@V=#28zQGno#h_R@frvBwcw3`kL%ypqYCX>mi2Cic~rWpn_>?4Z_ z&vO!5<4zh4ooat(DoqH zidD5HRz++x?5$SOvo7MBVXaNyKA7;(wW#7&qMZtBRGHo?!AC+Se-8c0E(+&xFF8o# zc0GK83N${-bd_&4VTW1XdOhXdv|yG!gE3{JwR~H^8oSzg6a|UXj=;pLl${lDnR1e= zA&Wffw$0ehlp>uJ;EnM#+N`$>L`(>#ophLQ6(bV)Z)nj9IHkeh(&rX3$_EMP$=E26 cZ}(EAM@{|im*G8Q;O(59yESp#ut(YT2iY0bX#fBK delta 33899 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 h{sl{k%Xl^JPi#N1L5sgwQ zflE{pH3T)ZSG2iw=iT||2BGVBzvJHWKA-RRP4BbPqMSL7f6$Pex1Pfz(FFYd74Z4h zOSxZ~1m1zF#9>AngB1&}r3HXCk|trxTpXUuET&}vE^S?cM;C1jIRsT3otQe|uq69& zufjrs#m);KK7IJ{o@m+BA*@ye80nyxP(E( z6iaFtwgrkFEd~V((^?qxQJP+9A$S`{Z!w5}+Ay?+QLXpld{uxc3%`mSo)X=+bpQ>b z(-C@@t##vCO@ISim%$aKP43Q%J#_(6mTuIO(2SABk1r&hh!b3ehZ%Z%(`d&`Lx85O k30R+_OK2iM@i-6as@BV+H}J2UtH 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­h=}Ph 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 MCE(IyXeXfgAOD7bumAu6 diff --git a/tests/data/incremental_dev_project/simple_add_calculator.zip b/tests/data/incremental_dev_project/simple_add_calculator.zip index e6e73f8f9b181e7858fe2dd006e00c8fbf48fe83..945e2af5dc2e3c61c19ef5262f64b9c56ffb5b38 100644 GIT binary patch delta 493 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 diff --git a/tests/data/incremental_dev_project/snake_game.zip b/tests/data/incremental_dev_project/snake_game.zip index 997203a18d39a3d9c94d64417ac057b8e23e7c75..739c2a1d1abc8981ca297596eedeca390cb66216 100644 GIT binary patch delta 650 zcmYjO&ubH56x{h%8(Nc?w9z(6yZKRRHMNnXwi1;_6xs^GLp^vB^&k`qB6w2p$Da@o z959qu^v1L7JCr9NPW9spzh)0&AfRt@3G%EdwvkrSFh&= zaIQ>wV|==ZI6DdKr&~h~U+5+o}@z`e2a9EOEYHN03EnFt=^VI+E}-Sq?Sj!0SFp zb8-^>Ud%A7P0^H+o@R*UJVLbUk`>P*5;Ww4k(T$~p1|_F{q-V`t7;#&FQZSrvv^}( z43=B6;!YQIT9{FVlhlRr z7uuLo=L;G0Oy7Q=l0GB=H`Dx8`R&h$z&idfV8j9vp U+2HgVGT|{}%$SjNoU(WSKj5Rj@&Et; literal 108388 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 KoB*bn%>MvDf*Z5| diff --git a/tests/data/incremental_dev_project/word_cloud.zip b/tests/data/incremental_dev_project/word_cloud.zip index d8747d14d884677004c7f29ce2422319cb679eaa..01f83f0530bf86e8c4c112a3c0dc59598173758e 100644 GIT binary patch delta 390 zcmXwzJxIe)6ovDiw9(q85!kspXHgK{>guMhRVxT0NHt0IzU4dL;c{QI{IGu5Jntc61yogq+@L`Qai%iz;n9ma zPHlo3iDO1nY1u^yHEoJs`7yu`;mNT-eys30m`tS;yn`8Zq%bnNh?XW|Ne%c!j^nm) z!Dh)RzSt^#4WOhikOFKYj=IiptjoCUkD}L5$%$h($Y-}RrpYwg#wNWF;oXQ~TM)53 z%xFaTi#Zgnq$oQFy5pXj4|^puOIFCb0_U@I&Hw-a delta 445 zcmYL^%}WAN6vby=V(1K`pp$9EC?Yey@w1&@L<^B9!bOV~QIU!Wq9BC?wP`OU2O_9V ztDu$cBxu`OXb~6$QUv`05#grii1grIe&?Qh-+gaz&@Wu{aWB|$Zna5~a^7w$hR49WU}IwdUuG0BBfJwu)+*b*H0)Ki3thLa4fkj4b5DB~`aCMJnFD#S1)xiKd2 z5Lv{&%_NTZbDW*UvCWw7*i7iLzRpz2utz9y%7&YlE!bf)Ka~sYCQ44`40kgsv5!&m zIF)Ps2v^Z8iF!o65H?p+-} F@(+A=d>a4& From fd4df17a16c9a53f6190cdc6f20a2e73d9f6b265 Mon Sep 17 00:00:00 2001 From: mannaandpoem <1580466765@qq.com> Date: Wed, 7 Feb 2024 09:48:02 +0800 Subject: [PATCH 3/7] add .gitignore --- tests/metagpt/test_incremental_dev.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/metagpt/test_incremental_dev.py b/tests/metagpt/test_incremental_dev.py index c47397dd7..3322df234 100644 --- a/tests/metagpt/test_incremental_dev.py +++ b/tests/metagpt/test_incremental_dev.py @@ -142,6 +142,9 @@ def check_or_create_base_tag(project_path): # Initialize a Git repository subprocess.run(["git", "init"], check=True) + # Check if the .gitignore exists. If it doesn't exist, create .gitignore and add the comment + subprocess.run(f"echo # Ignore these files or directories > {'.gitignore'}", shell=True) + # Check if the 'base' tag exists check_base_tag_cmd = ["git", "show-ref", "--verify", "--quiet", "refs/tags/base"] if subprocess.run(check_base_tag_cmd).returncode == 0: From 464de9e945a03f3e02882e01e3bd64663e82cf81 Mon Sep 17 00:00:00 2001 From: mannaandpoem <1580466765@qq.com> Date: Sun, 18 Feb 2024 19:12:45 +0800 Subject: [PATCH 4/7] 1. Split CODE_PLAN_AND_CHANGE into DEVELOPMENT_PLAN and IMPLEMENT_CHANGE 2. Update prompt 3. Adjust the position of the log for WriteCodePlanAndChange --- .../actions/write_code_plan_and_change_an.py | 58 +++++++++++++------ metagpt/actions/write_prd_an.py | 2 +- metagpt/roles/engineer.py | 1 - 3 files changed, 40 insertions(+), 21 deletions(-) diff --git a/metagpt/actions/write_code_plan_and_change_an.py b/metagpt/actions/write_code_plan_and_change_an.py index 708808050..f14e10ea5 100644 --- a/metagpt/actions/write_code_plan_and_change_an.py +++ b/metagpt/actions/write_code_plan_and_change_an.py @@ -6,30 +6,45 @@ @File : write_code_plan_and_change_an.py """ import os +from typing import List from pydantic import Field from metagpt.actions.action import Action from metagpt.actions.action_node import ActionNode +from metagpt.logs import logger from metagpt.schema import CodePlanAndChangeContext -CODE_PLAN_AND_CHANGE = ActionNode( - key="Code Plan And Change", +DEVELOPMENT_PLAN = ActionNode( + key="Development Plan", expected_type=str, - instruction="Developing comprehensive and step-by-step incremental development plan, and write Incremental " - "Change by making a code draft that how to implement incremental development including detailed steps based on the " - "context. Note: Track incremental changes using mark of '+' or '-' for add/modify/delete code, and conforms to the " - "output format of git diff", - example=""" -1. Plan for calculator.py: Enhance the functionality of `calculator.py` by extending it to incorporate methods for subtraction, multiplication, and division. Additionally, implement robust error handling for the division operation to mitigate potential issues related to division by zero. -```python + instruction="Develop a comprehensive and step-by-step incremental development plan, providing the essential " + "changes to be implemented at each step", + example="""To implement the new feature, we will create/change/update the methods in the calculator to support subtraction, multiplication, and division operations. Additionally, the ... +\nHere are the steps based on the order of 'Task List' we will follow:\n +1. Enhance the functionality of `calculator.py` by extending it to incorporate methods for subtraction, multiplication, and division. Also, the ... +2. Integrate new API endpoints for subtraction, multiplication, and division into the existing codebase of `main.py`. Then, ensure ... +3. ...""", +) + +IMPLEMENT_CHANGE = ActionNode( + key="Implement Change", + expected_type=List[str], + instruction="Write Incremental Change by making a code draft that how to implement incremental development " + "including detailed steps based on the context. Note: Track incremental changes using the marks `+` and `-` to " + "indicate added, deleted, or modified code, and ensure compliance with the output format of `git diff`", + example=[ + '''```diff +--- Old/calculator.py ++++ New/calculator.py + class Calculator: self.result = number1 + number2 return self.result - def sub(self, number1, number2) -> float: + def subtract(self, number1: float, number2: float) -> float: -+ ''' ++ """ + Subtracts the second number from the first and returns the result. + + Args: @@ -38,13 +53,13 @@ class Calculator: + + Returns: + float: The difference of number1 and number2. -+ ''' ++ """ + self.result = number1 - number2 + return self.result + def multiply(self, number1: float, number2: float) -> float: - pass -+ ''' ++ """ + Multiplies two numbers and returns the result. + + Args: @@ -53,15 +68,15 @@ class Calculator: + + Returns: + float: The product of number1 and number2. -+ ''' ++ """ + self.result = number1 * number2 + return self.result + def divide(self, number1: float, number2: float) -> float: - pass -+ ''' ++ """ + ValueError: If the second number is zero. -+ ''' ++ """ + if number2 == 0: + raise ValueError('Cannot divide by zero') + self.result = number1 / number2 @@ -75,10 +90,11 @@ class Calculator: + print("Result is already zero, no need to clear.") + self.result = 0.0 -``` +```''', + """```diff +--- Old/main.py ++++ New/main.py -2. Plan for main.py: Integrate new API endpoints for subtraction, multiplication, and division into the existing codebase of `main.py`. Then, ensure seamless integration with the overall application architecture and maintain consistency with coding standards. -```python def add_numbers(): result = calculator.add_numbers(num1, num2) return jsonify({'result': result}), 200 @@ -106,6 +122,7 @@ def add_numbers(): if __name__ == '__main__': app.run() ```""", + ], ) CODE_PLAN_AND_CHANGE_CONTEXT = """ @@ -179,7 +196,9 @@ Role: You are a professional engineer; The main goal is to complete incremental 9. Attention: Retain details that are not related to incremental development but are important for maintaining the consistency and clarity of the old code. """ -WRITE_CODE_PLAN_AND_CHANGE_NODE = ActionNode.from_children("WriteCodePlanAndChange", [CODE_PLAN_AND_CHANGE]) +WRITE_CODE_PLAN_AND_CHANGE_NODE = ActionNode.from_children( + "WriteCodePlanAndChange", [DEVELOPMENT_PLAN, IMPLEMENT_CHANGE] +) class WriteCodePlanAndChange(Action): @@ -200,6 +219,7 @@ class WriteCodePlanAndChange(Action): task=task_doc.content, code=code_text, ) + logger.info("Writing code plan and change..") return await WRITE_CODE_PLAN_AND_CHANGE_NODE.fill(context=context, llm=self.llm, schema="json") async def get_old_codes(self) -> str: diff --git a/metagpt/actions/write_prd_an.py b/metagpt/actions/write_prd_an.py index 9898be55b..5733b29da 100644 --- a/metagpt/actions/write_prd_an.py +++ b/metagpt/actions/write_prd_an.py @@ -56,7 +56,7 @@ REFINED_PRODUCT_GOALS = ActionNode( key="Refined Product Goals", expected_type=List[str], instruction="Update and expand the original product goals to reflect the evolving needs due to incremental " - "development.Ensure that the refined goals align with the current project direction and contribute to its success.", + "development. Ensure that the refined goals align with the current project direction and contribute to its success.", example=[ "Enhance user engagement through new features", "Optimize performance for scalability", diff --git a/metagpt/roles/engineer.py b/metagpt/roles/engineer.py index 7037ca0b3..235ec0f69 100644 --- a/metagpt/roles/engineer.py +++ b/metagpt/roles/engineer.py @@ -204,7 +204,6 @@ class Engineer(Role): async def _act_code_plan_and_change(self): """Write code plan and change that guides subsequent WriteCode and WriteCodeReview""" - logger.info("Writing code plan and change..") node = await self.rc.todo.run() code_plan_and_change = node.instruct_content.model_dump_json() dependencies = { From b8448d8b2d1d19a37b1b7ee31f1365d45807e6ea Mon Sep 17 00:00:00 2001 From: mannaandpoem <1580466765@qq.com> Date: Mon, 19 Feb 2024 16:20:56 +0800 Subject: [PATCH 5/7] 1. Update zip files to maintain consistency with TASK_PDF_FILE_REPO of const.py 2. Update prompt --- .../actions/write_code_plan_and_change_an.py | 16 ++++++++-------- tests/data/incremental_dev_project/Gomoku.zip | Bin 25822 -> 25572 bytes .../dice_simulator_new.zip | Bin 16807 -> 16549 bytes .../number_guessing_game.zip | Bin 15150 -> 14844 bytes .../incremental_dev_project/pygame_2048.zip | Bin 20336 -> 20066 bytes .../simple_add_calculator.zip | Bin 15141 -> 14831 bytes .../incremental_dev_project/snake_game.zip | Bin 19434 -> 19020 bytes .../incremental_dev_project/word_cloud.zip | Bin 12634 -> 12368 bytes 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/metagpt/actions/write_code_plan_and_change_an.py b/metagpt/actions/write_code_plan_and_change_an.py index f14e10ea5..7d40d0695 100644 --- a/metagpt/actions/write_code_plan_and_change_an.py +++ b/metagpt/actions/write_code_plan_and_change_an.py @@ -18,21 +18,21 @@ from metagpt.schema import CodePlanAndChangeContext DEVELOPMENT_PLAN = ActionNode( key="Development Plan", expected_type=str, - instruction="Develop a comprehensive and step-by-step incremental development plan, providing the essential " - "changes to be implemented at each step", - example="""To implement the new feature, we will create/change/update the methods in the calculator to support subtraction, multiplication, and division operations. Additionally, the ... -\nHere are the steps based on the order of 'Task List' we will follow:\n + instruction="Develop a comprehensive and step-by-step incremental development plan, providing the detail " + "changes to be implemented at each step based on the order of 'Task List'", + example="""To implement the new feature, we will create/change/update the methods in the calculator to support subtraction, multiplication, and division operations. +\nSteps to be followed:\n 1. Enhance the functionality of `calculator.py` by extending it to incorporate methods for subtraction, multiplication, and division. Also, the ... 2. Integrate new API endpoints for subtraction, multiplication, and division into the existing codebase of `main.py`. Then, ensure ... 3. ...""", ) -IMPLEMENT_CHANGE = ActionNode( - key="Implement Change", +INCREMENTAL_CHANGE = ActionNode( + key="Incremental Change", expected_type=List[str], instruction="Write Incremental Change by making a code draft that how to implement incremental development " "including detailed steps based on the context. Note: Track incremental changes using the marks `+` and `-` to " - "indicate added, deleted, or modified code, and ensure compliance with the output format of `git diff`", + "indicate additions and deletions, and ensure compliance with the output format of `git diff`", example=[ '''```diff --- Old/calculator.py @@ -197,7 +197,7 @@ Role: You are a professional engineer; The main goal is to complete incremental """ WRITE_CODE_PLAN_AND_CHANGE_NODE = ActionNode.from_children( - "WriteCodePlanAndChange", [DEVELOPMENT_PLAN, IMPLEMENT_CHANGE] + "WriteCodePlanAndChange", [DEVELOPMENT_PLAN, INCREMENTAL_CHANGE] ) diff --git a/tests/data/incremental_dev_project/Gomoku.zip b/tests/data/incremental_dev_project/Gomoku.zip index a110ccdd227458dcd40b9ee242418da2184c60af..5877b8b81f9b495258c758a3d667d4fe63359ea9 100644 GIT binary patch delta 562 zcmX|8&1(}u6yNuXHpVsG#%+uyt_^9EGD-_lP&8^R?%FmMQdhxjw)xtEAU!Bj5L&U& zgB}W+{{9Cq;z5cC1x39`@zj$NMLj4|=vfd%oZTkQFpuBYdkiyQHt731dbHj(U$mPq zvulUx#f7fYq>T?|j?zdKblk9damq^2XosyWTCFG^l&1YAd@h~9!4o7qQPgS?^6;yCmRD8$R5SmLJ8pz7;=X&D zZ};H*(ImdPf}iZbq!z`~iVADS;DuP=ZpY$*^jJ#Qj6m8j^gz0v(f2CB>X&r@sfx?n zLPmzAE$A&iRxE1bNOg?=0Ej)kh=WFEKj2k@#YXbD@@Ji8{InTdVGx}pcu{8ws~ z6Wlb>dv!mSYe_8~7=F>@d2NE~1KlIVg5QL5R;*{V9U!G&B3i8vBI^xnnYO&sw>cgR zyf@K@mAc@*i8jsRlc(Zu-QbnUKw4^O7@Acv)iC&dN4i8~(7ZT)Gz85{Wb>QLGOgp7 y9mcXZ#J@W9w&J;duiJsv9-cJ1~rmX`Z@SWym^eD)7WNuxIa delta 733 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 delta 3980 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 diff --git a/tests/data/incremental_dev_project/number_guessing_game.zip b/tests/data/incremental_dev_project/number_guessing_game.zip index 9d192c1e60e5349af5a9d4a1928975a5c4fae238..f5d983d6cc41eb11b4e0357b6899ee79ba05b7cc 100644 GIT binary patch delta 780 zcmZWmL1+_E5Z#@)wj^~~TVsenf4iGXF&o_MPrBPp@DvaVJv5L@w4$DR=s^UFRM0~& zUXwaU4_Xk#i-L=nqM#r`)q*!qV(C!|=|x0P=-ZY&}ESH`}%tTo^ zhMmf_&@66N#9X}O5TuTd4;))|@V#?YUPOcW!pb5e@&}G6{$wg%X=wP0oq_ZSnykR7 z^Fs8)CGa^dD83kWsuql9VtCdV-b9kDWGjtFpH6UL4tLZnYPB)ZZn8#TT#acHS85h4 z4WNsA9Gc@vwl#ABnz^LM<_rVKCou0a_;v_a-3r_(i0nJJka&L+QTs+3sW*1SFdH)b zClZIpxa(1^87F1Q;L#iv&BG+W4eoi-LH~IKiiSw-8&W&_=BUfn2aO6j3^NP7`QYVc7|v^2P>FBIxY z)PpU*^df>NSUi|ZKtzZX4~0sFdJ;Scdh}Ag7j$Me&vq7u|MC6b|IatGyJq#q@`lZ| zlwaA*dii?nH0oFhxGxN@>^OoK7cR|}%*FZn^VhG;ncDP8o4udm);`8+9QVaxqsCXK z-A)bI3?3#`P;fhHJ?<^cV&6QI3=|R8ga+t{K)@XhL3T^9l$Ap54n2s@bZ_dH=MF|_ z!;a7dor$72v$h&qW#lzY-sbj_?F1zFqxOO}=7ZiOUz=9Wa%_TXtZdC2O}w@upH+uF z&^*#!5fs{xugsa1(!ye;yjU?|Yvclz40LT0-eg2B0S~lfc%Mid?nf<|;I<}lN8zUy zg?F0D-6YmI?j;mP4W>rfkg(eY3qC1h2@R?>f3Qtoie%p3G z2>rmPReagkD4fL){Vk5~X&p}mT5dk0QHx315|2gOcora&8#co9+N? z=PcA;f;z4cR2s&|hVf%+>hMJIK_qW!R3DS@?-=9x5p%+OO@KaQ2q)t#6p0T2pRB}1TZOjNqge@G*Ef2{LWlE2d7 Pq#&7mpWFzY(x~?z$m;yX diff --git a/tests/data/incremental_dev_project/pygame_2048.zip b/tests/data/incremental_dev_project/pygame_2048.zip index d589a59b35b7b7bf5190f5123236fdd648498da9..35cd7425968d8210c9236e384a3708c7d8a42b53 100644 GIT binary patch delta 562 zcmew`kMYqQ#t8?QD*}Qi9@g2c%lKHIxzHT~$p(fhj2e>_4J9Y%dkao(FqCGr zgz+{XH+(HP`K5ChNaJKD7n{klz5V7*_&WfsC(#r26D+e#yyuJa{JmbC+X!DmXdOU2SrzkO)}ly0i!n z0~ja($$n|DB)^OhP*RKOkrI$AHJQoNjOm~%m>J?}$fTzQW-jzJXDWs;zW_yd>VQQZ zz4RITCKq~XgF|Y*mo(D}gUJg`Bqm?+k`d5=*aRd6fcOtY0u+8)-m(IgP)SAx1t81G z5UdL%+30P<^v4*;)t&stTZ_rn1jw|X9Oow^pa#_fG4He~Sc|=x(B!o~8ch6VVD5V# zAEw>rV5YtW+vI3p4W`c!?p$AcraD`Qj2-9X|GrvGyJ1{up!r%%Qubik3-)}IHvqXY ZFs{5yu-!7P~Z&W0RR$eseAwc delta 700 zcmaKq&2JJx7{+I&wU{meq?q!lSW;WIk_C$`B@k@*-fbiCU>Yw3D;gUKMBv~}OpFIV z3VA$uAb9ZVLE^0kzk1VpX!s9IObf*0#mCTE1D#SL>xx;ohBMRYF6scl$kQXyc&=&jlCC!BPD7+nJZ3 zC3|TVivb4<9|i9o2X;@P>9@LUgpkVp+l5jwf6*TdNws3NmM_<9m3oaQt;AQ&a1c5^lzHTpB|!vA}NW(9oTO zloZ)(6@%O)vJV2b1uJ?Sf2ugcRVPv@1M3<<&305$BHK~%JU(;u8a4D8ZSbW<<}vdy z%u$b5=`-w`LtFikjxe`}qaD%A9P3YNxSk2nyZDs3O1u2+fRqi;Unpc{x`j8{8Lfw% zq=StFPzYLKl$}N|@6%wI_!LG{7JXGIr%+}g7OtEm2knWK8|2I8DkJ2{F!vn!DRFaZ zs9*3?*pMSE669%pm{dgi2sveq33FPV{v|VZmkl^j?Ci?1WI|{u!Vc#($KL!1UMx+s z*^m}ag-&BjcH$53{`;sVNz1eBaDaPJ2bzi#Pk9Tk$F$XE%)r~O$G$R*wU|k-ZgH@` o_OanC&!|@qdr`d_gQ5QN+xUMjN=`X3qFO!tsS1Sba5Eu)0eyeX!vFvP diff --git a/tests/data/incremental_dev_project/simple_add_calculator.zip b/tests/data/incremental_dev_project/simple_add_calculator.zip index 945e2af5dc2e3c61c19ef5262f64b9c56ffb5b38..57975c8f30bed01577c3e7856780c5805682dd4c 100644 GIT binary patch delta 680 zcmZ`#PiWI%6i;63I%Ainu1;-ZlUk6HHEGhMX*;JPf{N`RYzK>T;#q_Z1U(I-tYH*@5g)J%lo_cn!iG` z-o*TGclj>=HX3?xZ2}pw#uqUk&!Q>D<$_lWg%cdd^>aVQ^u|DAd_PSbcPY$XN3{G$ ze3!--t4nOVF#GRQmy+_F@9JirPk@XV4`wn?MY<43g% ze20%M;fyWduO-Kd2Z{nRMJLY|=PAMcXZ3aiANbzz8}QsUq|yPS4JjCB##WHGHOj}^ zaFP~}wo?JS_6TkFLJ3pOD18|0Dw>Hf-a8ugCwi!3SaRhBQ>3|*UG`@3FdmjP`qWFM zFzv_-u1Hr?UEx|v!Z}lf=O*cCFYW*OS=vcsvtl4p*6`Uiv7(5WF6U@Y3Fs9i3SCWN zr>xP1(*bp*Ql|B6kiM>1yorld7eiHzf5fsow2@<_61J)i)rSMsx8W$pM{@L{0|lJV V3qxM*P@n&U8Fpu*953!5RPn delta 736 zcmY+C&1(};6vbz5OlzCWbkd|HA2lsAlIk>>nKaW$QrbqLs8|ZMD_zuJHK0O_I!O^x zh|4Yn&5>*cMZ|T%WkGl1LU%0+rEaSDQLX=g&P+2QeQ$Gq_nv#X@A7_|FIFD?@EG;{ z<6VRMI-fevxCeV(V&CP;l~U2HmCKiIUn`j^v_y1GXP@~onGmqU&ERYz+TeR}h7YhN zF7PpS7GHwWKCivvU&kY!Lm{W-f#z03!bx9*tCq}au~MtvtW~Y{OQ~gh7Q9WJ!hKC( zWki&uzjFu(>0yKwo|akcXcSjLAqE%uL1DJFQI;98)bqB>T3AX~8sj`k0jKhMU;wAbWm<7@6#w)gY+8<;e#g<9 znIt{v$WQ$O?qsG&2syZ!QD|{r%6fs_z#Bb@rY=)F>f|5lJ@}}WgmE}N#i2?w`x zN083R^xnldkjs#Cyp=si&9PRUh;sfIeRpvLAM$>fT2zo)J7gHaQZG}sUpnx27UsNN Pwn?(?D9140Qa1euMG)fP diff --git a/tests/data/incremental_dev_project/snake_game.zip b/tests/data/incremental_dev_project/snake_game.zip index 739c2a1d1abc8981ca297596eedeca390cb66216..2c7b01b7c54d164a9d8508b5bf7cbdcca6f0a3ed 100644 GIT binary patch delta 631 zcmY+AL2DCH6oud1XcL{uWG0Di8f$DTC3V!KHC@y+G?SUkq?v&>(iF1mwjfB|yKzz6 z)s!Q+2~_b9h*6k@3%hb7sNhnFt`v6#1r;jJye5_K;Bmfl?z`OkzCRM)J`~z7LpzQ2 zJ#VQyCwNlmeq$YFaRM1rLPAbamO(YgaLZIL1$8)9tn zq^jGIuTfW2H*R#6 z8LFO$^H%TUajaUiv^hWp`&NnC37-D2a`fg{F4<*zI?mmmeFhy{quu~5^3punt;zm( zY4m%5bt+|Wm`~x*cejt_T3teAMWbi`ac@PZ%rq|y(%y6uVqK%rD}8H~nt5MN;kEA` z%=z*>!cKv9uJeMXGf#yDF87^zp@0O<{#g?l I`??&^KUYqtt^fc4 delta 806 zcmZ{iO=uHA6vuZaH3735H#ALR(_|YPY}_^pX-mrb(cNs)CNY9NRD)l{&@5IYAGisK z2rYsaK~SDh#E&W{cucNA@s5ik1wx|~sbas-K_D~jPe((L?y!YQ>-d;yv zXVKLcChekhZE;VJz%YznE}YTwrwS!4Qmjnsk;zI?%j@-0sc`nRrbpm{rSs{JMb>m^ zsvn+k3JSt^ZkJh)jAu=4Fs(X~WF(NjaKaYCC_n-?yS@j!=e!G-`FwcD)aD@b7^Y|D zQjS7vag%+Wi<+j_@|Ak6TCb7uUq*6-veU^+d@meHvhXu* zf~sP}fljE7c0+Ph#3v0rjwKJ-+z|3`a982M;^A4tUDNgXRnbQ}81wjT&JEsQ!^~I$ zulV5JfEyZPF&q^rhEfOc+>Tb3g}KxSp6y!;5BIs@V2Xv_v=4uX&~!dMh}9^?N9hlo9dsA(~BPqWG0Wu`F5O22mdFrePy9jBoCx7~a42D8deA^Y_$rZ(RG7y!q=I T&u%drl{?87BlmHK)H2L}#n7Mg2e>1yzQ?WKaQMgSPJ^Ef8&tT)3QuG3hj7hWc>jIJ6BXP83Fa zA6xO^(btT{c86X15cfAB=o%RIhXX_&N|G{uDv-pqYvE9EEM>SAQB)r;V;+NIh%Fc> z7*TACK6-+CA(Ha9Q@>UE`fqwMkPAi8leT%PT&21-m>Q_*Hqs3|UxrDU&HusAOqPo> zRL;{M*wZn4e^M{k%Z_aQ gTF7-Wo{(uPo^yijx9HbQXCh=1n|xIf;^`fI1HXcNy8r+H delta 600 zcmcbRa4TuT1?G?j%ZZn@C+BbrOrFms!jqhzk{VxJnwy(glsQ?7TXymTb(YC4j3S%W z7|(G|KEoz3nT6YUaw`}APX53v0p%-di)`M-eUo?cZY}{S z2?hp+^8BKd_~e}Y(iHuY)Z&u({L+$w(vr#2+%lUNOTOm?xnc5Db?eDDwFDUDCqGnI z~lJ_ry1 zQc>KKKk|x0{c%Q1R=^S_%b);cEkKr5)V5*z4iPw~EjqbdTZ_q_2dw>^b|B-$$qG6_ zOd@ Date: Tue, 20 Feb 2024 10:30:50 +0800 Subject: [PATCH 6/7] Update test case and prompt --- .../actions/write_code_plan_and_change_an.py | 19 +++++++++---------- tests/data/incremental_dev_project/mock.py | 9 ++++++++- .../test_write_code_plan_and_change_an.py | 3 ++- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/metagpt/actions/write_code_plan_and_change_an.py b/metagpt/actions/write_code_plan_and_change_an.py index 7d40d0695..6a78fb5d9 100644 --- a/metagpt/actions/write_code_plan_and_change_an.py +++ b/metagpt/actions/write_code_plan_and_change_an.py @@ -17,14 +17,13 @@ from metagpt.schema import CodePlanAndChangeContext DEVELOPMENT_PLAN = ActionNode( key="Development Plan", - expected_type=str, + expected_type=List[str], instruction="Develop a comprehensive and step-by-step incremental development plan, providing the detail " "changes to be implemented at each step based on the order of 'Task List'", - example="""To implement the new feature, we will create/change/update the methods in the calculator to support subtraction, multiplication, and division operations. -\nSteps to be followed:\n -1. Enhance the functionality of `calculator.py` by extending it to incorporate methods for subtraction, multiplication, and division. Also, the ... -2. Integrate new API endpoints for subtraction, multiplication, and division into the existing codebase of `main.py`. Then, ensure ... -3. ...""", + example=[ + "Enhance the functionality of `calculator.py` by extending it to incorporate methods for subtraction, ...", + "Update the existing codebase in main.py to incorporate new API endpoints for subtraction, ...", + ], ) INCREMENTAL_CHANGE = ActionNode( @@ -189,16 +188,16 @@ Role: You are a professional engineer; The main goal is to complete incremental 2. COMPLETE CODE: Your code will be part of the entire project, so please implement complete, reliable, reusable code snippets. 3. Set default value: If there is any setting, ALWAYS SET A DEFAULT VALUE, ALWAYS USE STRONG TYPE AND EXPLICIT VARIABLE. AVOID circular import. 4. Follow design: YOU MUST FOLLOW "Data structures and interfaces". DONT CHANGE ANY DESIGN. Do not use public member functions that do not exist in your design. -5. Follow Code Plan And Change: If there is any Incremental Change that is marked by the git diff format using '+' and '-' for add/modify/delete code, or Legacy Code files contain "{filename} to be rewritten", you must merge it into the code file according to the plan. +5. Follow Code Plan And Change: If there is any "Incremental Change" that is marked by the git diff format with '+' and '-' symbols, or Legacy Code files contain "{filename} to be rewritten", you must merge it into the code file according to the "Development Plan". 6. CAREFULLY CHECK THAT YOU DONT MISS ANY NECESSARY CLASS/FUNCTION IN THIS FILE. 7. Before using a external variable/module, make sure you import it first. 8. Write out EVERY CODE DETAIL, DON'T LEAVE TODO. 9. Attention: Retain details that are not related to incremental development but are important for maintaining the consistency and clarity of the old code. """ -WRITE_CODE_PLAN_AND_CHANGE_NODE = ActionNode.from_children( - "WriteCodePlanAndChange", [DEVELOPMENT_PLAN, INCREMENTAL_CHANGE] -) +CODE_PLAN_AND_CHANGE = [DEVELOPMENT_PLAN, INCREMENTAL_CHANGE] + +WRITE_CODE_PLAN_AND_CHANGE_NODE = ActionNode.from_children("WriteCodePlanAndChange", CODE_PLAN_AND_CHANGE) class WriteCodePlanAndChange(Action): diff --git a/tests/data/incremental_dev_project/mock.py b/tests/data/incremental_dev_project/mock.py index f2eb71359..5bf1781e8 100644 --- a/tests/data/incremental_dev_project/mock.py +++ b/tests/data/incremental_dev_project/mock.py @@ -373,7 +373,14 @@ REFINED_TASKS_JSON = { } CODE_PLAN_AND_CHANGE_SAMPLE = { - "Code Plan And Change": '\n1. Plan for gui.py: Develop the GUI using Tkinter to replace the command-line interface. Start by setting up the main window and event handling. Then, add widgets for displaying the game status, results, and feedback. Implement interactive elements for difficulty selection and visualize the guess history. Finally, create animations for guess feedback and ensure responsiveness across different screen sizes.\n```python\nclass GUI:\n- pass\n+ def __init__(self):\n+ self.setup_window()\n+\n+ def setup_window(self):\n+ # Initialize the main window using Tkinter\n+ pass\n+\n+ def bind_events(self):\n+ # Bind button clicks and other events\n+ pass\n+\n+ def update_feedback(self, message: str):\n+ # Update the feedback label with the given message\n+ pass\n+\n+ def update_attempts(self, attempts: int):\n+ # Update the attempts label with the number of attempts\n+ pass\n+\n+ def update_history(self, history: list):\n+ # Update the history view with the list of past guesses\n+ pass\n+\n+ def show_difficulty_selector(self):\n+ # Show buttons or a dropdown for difficulty selection\n+ pass\n+\n+ def animate_guess_result(self, correct: bool):\n+ # Trigger an animation for correct or incorrect guesses\n+ pass\n```\n\n2. Plan for main.py: Modify the main.py to initialize the GUI and start the event-driven game loop. Ensure that the GUI is the primary interface for user interaction.\n```python\nclass Main:\n def main(self):\n- user_interface = UI()\n- user_interface.start()\n+ graphical_user_interface = GUI()\n+ graphical_user_interface.setup_window()\n+ graphical_user_interface.bind_events()\n+ # Start the Tkinter main loop\n+ pass\n\n if __name__ == "__main__":\n main_instance = Main()\n main_instance.main()\n```\n\n3. Plan for ui.py: Refactor ui.py to work with the new GUI class. Remove command-line interactions and delegate display and input tasks to the GUI.\n```python\nclass UI:\n- def display_message(self, message: str):\n- print(message)\n+\n+ def display_message(self, message: str):\n+ # This method will now pass the message to the GUI to display\n+ pass\n\n- def get_user_input(self, prompt: str) -> str:\n- return input(prompt)\n+\n+ def get_user_input(self, prompt: str) -> str:\n+ # This method will now trigger the GUI to get user input\n+ pass\n\n- def show_attempts(self, attempts: int):\n- print(f"Number of attempts: {attempts}")\n+\n+ def show_attempts(self, attempts: int):\n+ # This method will now update the GUI with the number of attempts\n+ pass\n\n- def show_history(self, history: list):\n- print("Guess history:")\n- for guess in history:\n- print(guess)\n+\n+ def show_history(self, history: list):\n+ # This method will now update the GUI with the guess history\n+ pass\n```\n\n4. Plan for game.py: Ensure game.py remains mostly unchanged as it contains the core game logic. However, make minor adjustments if necessary to integrate with the new GUI.\n```python\nclass Game:\n # No changes required for now\n```\n' + "Development Plan": [ + "Develop the GUI using Tkinter to replace the command-line interface. Start by setting up the main window and event handling. Then, add widgets for displaying the game status, results, and feedback. Implement interactive elements for difficulty selection and visualize the guess history. Finally, create animations for guess feedback and ensure responsiveness across different screen sizes.", + "Modify the main.py to initialize the GUI and start the event-driven game loop. Ensure that the GUI is the primary interface for user interaction.", + ], + "Incremental Change": [ + """```diff\nclass GUI:\n- pass\n+ def __init__(self):\n+ self.setup_window()\n+\n+ def setup_window(self):\n+ # Initialize the main window using Tkinter\n+ pass\n+\n+ def bind_events(self):\n+ # Bind button clicks and other events\n+ pass\n+\n+ def update_feedback(self, message: str):\n+ # Update the feedback label with the given message\n+ pass\n+\n+ def update_attempts(self, attempts: int):\n+ # Update the attempts label with the number of attempts\n+ pass\n+\n+ def update_history(self, history: list):\n+ # Update the history view with the list of past guesses\n+ pass\n+\n+ def show_difficulty_selector(self):\n+ # Show buttons or a dropdown for difficulty selection\n+ pass\n+\n+ def animate_guess_result(self, correct: bool):\n+ # Trigger an animation for correct or incorrect guesses\n+ pass\n```""", + """```diff\nclass Main:\n def main(self):\n- user_interface = UI()\n- user_interface.start()\n+ graphical_user_interface = GUI()\n+ graphical_user_interface.setup_window()\n+ graphical_user_interface.bind_events()\n+ # Start the Tkinter main loop\n+ pass\n\n if __name__ == "__main__":\n main_instance = Main()\n main_instance.main()\n```\n\n3. Plan for ui.py: Refactor ui.py to work with the new GUI class. Remove command-line interactions and delegate display and input tasks to the GUI.\n```python\nclass UI:\n- def display_message(self, message: str):\n- print(message)\n+\n+ def display_message(self, message: str):\n+ # This method will now pass the message to the GUI to display\n+ pass\n\n- def get_user_input(self, prompt: str) -> str:\n- return input(prompt)\n+\n+ def get_user_input(self, prompt: str) -> str:\n+ # This method will now trigger the GUI to get user input\n+ pass\n\n- def show_attempts(self, attempts: int):\n- print(f"Number of attempts: {attempts}")\n+\n+ def show_attempts(self, attempts: int):\n+ # This method will now update the GUI with the number of attempts\n+ pass\n\n- def show_history(self, history: list):\n- print("Guess history:")\n- for guess in history:\n- print(guess)\n+\n+ def show_history(self, history: list):\n+ # This method will now update the GUI with the guess history\n+ pass\n```\n\n4. Plan for game.py: Ensure game.py remains mostly unchanged as it contains the core game logic. However, make minor adjustments if necessary to integrate with the new GUI.\n```python\nclass Game:\n # No changes required for now\n```\n""", + ], } REFINED_CODE_INPUT_SAMPLE = """ diff --git a/tests/metagpt/actions/test_write_code_plan_and_change_an.py b/tests/metagpt/actions/test_write_code_plan_and_change_an.py index 9cd51398f..e66d97700 100644 --- a/tests/metagpt/actions/test_write_code_plan_and_change_an.py +++ b/tests/metagpt/actions/test_write_code_plan_and_change_an.py @@ -50,7 +50,8 @@ async def test_write_code_plan_and_change_an(mocker): ) node = await WriteCodePlanAndChange(i_context=code_plan_and_change_context).run() - assert "Code Plan And Change" in node.instruct_content.model_dump() + assert "Development Plan" in node.instruct_content.model_dump() + assert "Incremental Change" in node.instruct_content.model_dump() @pytest.mark.asyncio From 7efda42c283ac5b9760ecfe437a53324e2639c9f Mon Sep 17 00:00:00 2001 From: mannaandpoem <1580466765@qq.com> Date: Wed, 28 Feb 2024 15:08:09 +0800 Subject: [PATCH 7/7] Improve the coverage --- metagpt/actions/design_api_an.py | 12 --- metagpt/actions/project_management_an.py | 12 --- .../actions/write_code_plan_and_change_an.py | 3 +- metagpt/utils/project_repo.py | 1 + tests/data/incremental_dev_project/mock.py | 4 +- tests/data/rsp_cache.json | 11 ++- tests/metagpt/actions/mock_json.py | 2 +- tests/metagpt/actions/test_design_api.py | 15 ++++ .../actions/test_project_management.py | 24 +++++- .../actions/test_project_management_an.py | 35 ++++++-- tests/metagpt/actions/test_write_code.py | 78 +++++++++++++++++- .../test_write_code_plan_and_change_an.py | 79 +++++++++++++++---- .../metagpt/actions/test_write_code_review.py | 23 ++++++ tests/metagpt/actions/test_write_prd.py | 46 +++++++++++ 14 files changed, 290 insertions(+), 55 deletions(-) diff --git a/metagpt/actions/design_api_an.py b/metagpt/actions/design_api_an.py index 35b50ef8f..5977cbd95 100644 --- a/metagpt/actions/design_api_an.py +++ b/metagpt/actions/design_api_an.py @@ -8,7 +8,6 @@ from typing import List from metagpt.actions.action_node import ActionNode -from metagpt.logs import logger from metagpt.utils.mermaid import MMC1, MMC2 IMPLEMENTATION_APPROACH = ActionNode( @@ -109,14 +108,3 @@ REFINED_NODES = [ DESIGN_API_NODE = ActionNode.from_children("DesignAPI", NODES) REFINED_DESIGN_NODE = ActionNode.from_children("RefinedDesignAPI", REFINED_NODES) - - -def main(): - prompt = DESIGN_API_NODE.compile(context="") - logger.info(prompt) - prompt = REFINED_DESIGN_NODE.compile(context="") - logger.info(prompt) - - -if __name__ == "__main__": - main() diff --git a/metagpt/actions/project_management_an.py b/metagpt/actions/project_management_an.py index 379a23384..0417c0ce4 100644 --- a/metagpt/actions/project_management_an.py +++ b/metagpt/actions/project_management_an.py @@ -8,7 +8,6 @@ from typing import List from metagpt.actions.action_node import ActionNode -from metagpt.logs import logger REQUIRED_PYTHON_PACKAGES = ActionNode( key="Required Python packages", @@ -119,14 +118,3 @@ REFINED_NODES = [ PM_NODE = ActionNode.from_children("PM_NODE", NODES) REFINED_PM_NODE = ActionNode.from_children("REFINED_PM_NODE", REFINED_NODES) - - -def main(): - prompt = PM_NODE.compile(context="") - logger.info(prompt) - prompt = REFINED_PM_NODE.compile(context="") - logger.info(prompt) - - -if __name__ == "__main__": - main() diff --git a/metagpt/actions/write_code_plan_and_change_an.py b/metagpt/actions/write_code_plan_and_change_an.py index 6a78fb5d9..f99bffd84 100644 --- a/metagpt/actions/write_code_plan_and_change_an.py +++ b/metagpt/actions/write_code_plan_and_change_an.py @@ -210,13 +210,12 @@ class WriteCodePlanAndChange(Action): prd_doc = await self.repo.docs.prd.get(filename=self.i_context.prd_filename) design_doc = await self.repo.docs.system_design.get(filename=self.i_context.design_filename) task_doc = await self.repo.docs.task.get(filename=self.i_context.task_filename) - code_text = await self.get_old_codes() context = CODE_PLAN_AND_CHANGE_CONTEXT.format( requirement=self.i_context.requirement, prd=prd_doc.content, design=design_doc.content, task=task_doc.content, - code=code_text, + code=await self.get_old_codes(), ) logger.info("Writing code plan and change..") return await WRITE_CODE_PLAN_AND_CHANGE_NODE.fill(context=context, llm=self.llm, schema="json") diff --git a/metagpt/utils/project_repo.py b/metagpt/utils/project_repo.py index c1f98e1ec..c7ddffb71 100644 --- a/metagpt/utils/project_repo.py +++ b/metagpt/utils/project_repo.py @@ -133,6 +133,7 @@ class ProjectRepo(FileRepository): code_files = self.with_src_path(path=git_workdir / git_workdir.name).srcs.all_files if not code_files: return False + return True def with_src_path(self, path: str | Path) -> ProjectRepo: try: diff --git a/tests/data/incremental_dev_project/mock.py b/tests/data/incremental_dev_project/mock.py index 5bf1781e8..e9f5cb123 100644 --- a/tests/data/incremental_dev_project/mock.py +++ b/tests/data/incremental_dev_project/mock.py @@ -149,7 +149,7 @@ sequenceDiagram The requirement analysis suggests the need for a clean and intuitive interface. Since we are using a command-line interface, we need to ensure that the text-based UI is as user-friendly as possible. Further clarification on whether a graphical user interface (GUI) is expected in the future would be helpful for planning the extendability of the game.""" -TASKS_SAMPLE = """ +TASK_SAMPLE = """ ## Required Python packages - random==2.2.1 @@ -345,7 +345,7 @@ REFINED_DESIGN_JSON = { "Anything UNCLEAR": "", } -REFINED_TASKS_JSON = { +REFINED_TASK_JSON = { "Required Python packages": ["random==2.2.1", "Tkinter==8.6"], "Required Other language third-party packages": ["No third-party dependencies required"], "Refined Logic Analysis": [ diff --git a/tests/data/rsp_cache.json b/tests/data/rsp_cache.json index 40d7d3953..7e2b4140c 100644 --- a/tests/data/rsp_cache.json +++ b/tests/data/rsp_cache.json @@ -389,5 +389,14 @@ "reflection": "The implementation failed the test case where the input array is [1, 5, 2, 3, 4]. The issue arises because the code does not handle the sorting of elements with the same number of ones in their binary representation correctly. According to the context, for similar number of ones, the elements should be sorted based on their decimal value in ascending order. However, the output [1, 2, 4, 3, 5] shows that 3 and 4 are not in the correct order, indicating that the sorting by decimal value is not functioning as intended. To fix this issue, we should ensure that the sorting is stable, so that when two elements have the same number of ones, they maintain their relative order if their decimal values are already in ascending order.", "improved_impl": "def sort_array(arr):\n # Helper function to count the number of ones in the binary representation\n def count_ones(n):\n return bin(n).count('1')\n \n # Sort the array using a custom key function\n # The key function returns a tuple (number of ones, value) for each element\n # This ensures that if two elements have the same number of ones, they are sorted by their value\n # We use a stable sorting algorithm to maintain the relative order of elements with the same number of ones\n sorted_arr = sorted(arr, key=lambda x: (count_ones(x), x), reverse=True)\n sorted_arr = sorted(sorted_arr, key=count_ones)\n \n return sorted_arr\n" }, - "\n## context\n\n\n-----\n\n## format example\n[CONTENT]\n{\n \"invoice\": \"False\"\n}\n[/CONTENT]\n\n## nodes: \": # \"\n- invoice: # if it's a invoice file, return True else False\n\n\n## constraint\nLanguage: Please use the same language as Human INPUT.\nFormat: output wrapped inside [CONTENT][/CONTENT] like format example, nothing else.\n\n## action\nFollow instructions of nodes, generate output and make sure it follows the format example.\n": "[CONTENT]\n{\n \"invoice\": \"True\"\n}\n[/CONTENT]" + "\n## context\n\n\n-----\n\n## format example\n[CONTENT]\n{\n \"invoice\": \"False\"\n}\n[/CONTENT]\n\n## nodes: \": # \"\n- invoice: # if it's a invoice file, return True else False\n\n\n## constraint\nLanguage: Please use the same language as Human INPUT.\nFormat: output wrapped inside [CONTENT][/CONTENT] like format example, nothing else.\n\n## action\nFollow instructions of nodes, generate output and make sure it follows the format example.\n": "[CONTENT]\n{\n \"invoice\": \"True\"\n}\n[/CONTENT]", + "\n## context\n\n### Legacy Content\n\n## Implementation approach\n\nWe will create a Python-based number guessing game with a simple command-line interface. For the user interface, we will use the built-in 'input' and 'print' functions for interaction. The random library will be used for generating random numbers. We will structure the code to be modular and easily extendable, separating the game logic from the user interface.\n\n## File list\n\n- main.py\n- game.py\n- ui.py\n\n## Data structures and interfaces\n\n\nclassDiagram\n class Game {\n -int secret_number\n -int min_range\n -int max_range\n -list attempts\n +__init__(difficulty: str)\n +start_game()\n +check_guess(guess: int) str\n +get_attempts() int\n +get_history() list\n }\n class UI {\n +start()\n +display_message(message: str)\n +get_user_input(prompt: str) str\n +show_attempts(attempts: int)\n +show_history(history: list)\n +select_difficulty() str\n }\n class Main {\n +main()\n }\n Main --> UI\n UI --> Game\n\n\n## Program call flow\n\n\nsequenceDiagram\n participant M as Main\n participant UI as UI\n participant G as Game\n M->>UI: start()\n UI->>UI: select_difficulty()\n UI-->>G: __init__(difficulty)\n G->>G: start_game()\n loop Game Loop\n UI->>UI: get_user_input(\"Enter your guess:\")\n UI-->>G: check_guess(guess)\n G->>UI: display_message(feedback)\n G->>UI: show_attempts(attempts)\n G->>UI: show_history(history)\n end\n G->>UI: display_message(\"Correct! Game over.\")\n UI->>M: main() # Game session ends\n\n\n## Anything UNCLEAR\n\nThe requirement analysis suggests the need for a clean and intuitive interface. Since we are using a command-line interface, we need to ensure that the text-based UI is as user-friendly as possible. Further clarification on whether a graphical user interface (GUI) is expected in the future would be helpful for planning the extendability of the game.\n\n### New Requirements\n{'Language': 'en_us', 'Programming Language': 'Python', 'Refined Requirements': 'Adding graphical interface functionality to enhance the user experience in the number-guessing game.', 'Project Name': 'number_guessing_game', 'Refined Product Goals': ['Ensure a user-friendly interface for the game with the new graphical interface', 'Provide a challenging yet enjoyable game experience with visual enhancements', 'Design the game to be easily extendable for future features, including graphical elements'], 'Refined User Stories': ['As a player, I want to interact with a graphical interface to guess numbers and receive visual feedback on my guesses', 'As a player, I want to easily select the difficulty level through the graphical interface', 'As a player, I want to visually track my previous guesses and the number of attempts in the graphical interface', 'As a player, I want to be congratulated with a visually appealing message when I guess the number correctly'], 'Competitive Analysis': ['Guess The Number Game A: Basic text interface, no difficulty levels', 'Number Master B: Has difficulty levels, but cluttered interface', 'Quick Guess C: Sleek design, but lacks performance tracking', 'NumGuess D: Good performance tracking, but not mobile-friendly', 'GuessIt E: Mobile-friendly, but too many ads', 'Perfect Guess F: Offers hints, but the hints are not very helpful', 'SmartGuesser G: Has a learning mode, but lacks a competitive edge', 'Graphical Guess H: Graphical interface, but poor user experience due to complex design'], 'Competitive Quadrant Chart': 'quadrantChart\\n title \"User Engagement and Game Complexity with Graphical Interface\"\\n x-axis \"Low Complexity\" --> \"High Complexity\"\\n y-axis \"Low Engagement\" --> \"High Engagement\"\\n quadrant-1 \"Too Simple\"\\n quadrant-2 \"Niche Appeal\"\\n quadrant-3 \"Complex & Unengaging\"\\n quadrant-4 \"Sweet Spot\"\\n \"Guess The Number Game A\": [0.2, 0.4]\\n \"Number Master B\": [0.5, 0.3]\\n \"Quick Guess C\": [0.6, 0.7]\\n \"NumGuess D\": [0.4, 0.6]\\n \"GuessIt E\": [0.7, 0.5]\\n \"Perfect Guess F\": [0.6, 0.4]\\n \"SmartGuesser G\": [0.8, 0.6]\\n \"Graphical Guess H\": [0.7, 0.3]\\n \"Our Target Product\": [0.5, 0.9]', 'Refined Requirement Analysis': ['The game should maintain its simplicity while integrating a graphical interface for enhanced engagement.', 'Immediate visual feedback is crucial for user satisfaction in the graphical interface.', 'The interface must be intuitive, allowing for easy navigation and selection of game options.', \"The graphical design should be clean and not detract from the game's core guessing mechanic.\"], 'Refined Requirement Pool': [['P0', 'Implement a graphical user interface (GUI) to replace the command-line interaction'], ['P0', 'Design a user interface that displays the game status, results, and feedback clearly with graphical elements'], ['P1', 'Incorporate interactive elements for selecting difficulty levels'], ['P1', \"Visualize the history of the player's guesses and the number of attempts within the game session\"], ['P2', 'Create animations for correct or incorrect guesses to enhance user feedback'], ['P2', 'Ensure the GUI is responsive and compatible with various screen sizes'], ['P2', \"Store and show the history of the player's guesses during a game session\"]], 'UI Design draft': 'The UI will feature a modern and minimalist design with a graphical number input field, a submit button with animations, and a dedicated area for visual feedback. It will include interactive elements to select the difficulty level and a visual display for the number of attempts and history of past guesses.', 'Anything UNCLEAR': ''}\n\n\n-----\n\n## format example\n[CONTENT]\n{\n \"Refined Implementation Approach\": \"We will refine ...\",\n \"Refined File list\": [\n \"main.py\",\n \"game.py\",\n \"new_feature.py\"\n ],\n \"Refined Data structures and interfaces\": \"\\nclassDiagram\\n class Main {\\n -SearchEngine search_engine\\n +main() str\\n }\\n class SearchEngine {\\n -Index index\\n -Ranking ranking\\n -Summary summary\\n +search(query: str) str\\n }\\n class Index {\\n -KnowledgeBase knowledge_base\\n +create_index(data: dict)\\n +query_index(query: str) list\\n }\\n class Ranking {\\n +rank_results(results: list) list\\n }\\n class Summary {\\n +summarize_results(results: list) str\\n }\\n class KnowledgeBase {\\n +update(data: dict)\\n +fetch_data(query: str) dict\\n }\\n Main --> SearchEngine\\n SearchEngine --> Index\\n SearchEngine --> Ranking\\n SearchEngine --> Summary\\n Index --> KnowledgeBase\\n\",\n \"Refined Program call flow\": \"\\nsequenceDiagram\\n participant M as Main\\n participant SE as SearchEngine\\n participant I as Index\\n participant R as Ranking\\n participant S as Summary\\n participant KB as KnowledgeBase\\n M->>SE: search(query)\\n SE->>I: query_index(query)\\n I->>KB: fetch_data(query)\\n KB-->>I: return data\\n I-->>SE: return results\\n SE->>R: rank_results(results)\\n R-->>SE: return ranked_results\\n SE->>S: summarize_results(ranked_results)\\n S-->>SE: return summary\\n SE-->>M: return summary\\n\",\n \"Anything UNCLEAR\": \"Clarification needed on third-party API integration, ...\"\n}\n[/CONTENT]\n\n## nodes: \": # \"\n- Refined Implementation Approach: # Update and extend the original implementation approach to reflect the evolving challenges and requirements due to incremental development. Outline the steps involved in the implementation process with the detailed strategies.\n- Refined File list: typing.List[str] # Update and expand the original file list including only relative paths. Up to 2 files can be added.Ensure that the refined file list reflects the evolving structure of the project.\n- Refined Data structures and interfaces: # Update and extend the existing mermaid classDiagram code syntax to incorporate new classes, methods (including __init__), and functions with precise type annotations. Delineate additional relationships between classes, ensuring clarity and adherence to PEP8 standards.Retain content that is not related to incremental development but important for consistency and clarity.\n- Refined Program call flow: # Extend the existing sequenceDiagram code syntax with detailed information, accurately covering theCRUD and initialization of each object. Ensure correct syntax usage and reflect the incremental changes introducedin the classes and API defined above. Retain content that is not related to incremental development but important for consistency and clarity.\n- Anything UNCLEAR: # Mention unclear project aspects, then try to clarify it.\n\n\n## constraint\nLanguage: Please use the same language as Human INPUT.\nFormat: output wrapped inside [CONTENT][/CONTENT] like format example, nothing else.\n\n## action\nFollow instructions of nodes, generate output and make sure it follows the format example.\n": "[CONTENT]\n{\n \"Refined Implementation Approach\": \"To accommodate the new graphical interface requirements, we will integrate the Tkinter library for Python to develop the GUI components. The implementation will involve designing the layout, creating interactive widgets for user input, and displaying visual feedback. We will also implement event-driven programming to handle user actions. The game logic will be encapsulated within the Game class, and the UI class will be responsible for rendering the game state graphically.\",\n \"Refined File list\": [\n \"main.py\",\n \"game.py\",\n \"ui.py\",\n \"gui.py\"\n ],\n \"Refined Data structures and interfaces\": \"\\nclassDiagram\\n class Game {\\n -int secret_number\\n -int min_range\\n -int max_range\\n -list attempts\\n +__init__(difficulty: str)\\n +start_game()\\n +check_guess(guess: int) str\\n +get_attempts() int\\n +get_history() list\\n }\\n class UI {\\n +start()\\n +display_message(message: str)\\n +get_user_input(prompt: str) str\\n +show_attempts(attempts: int)\\n +show_history(history: list)\\n +select_difficulty() str\\n }\\n class GUI {\\n +__init__(game: Game)\\n +render_main_window()\\n +update_feedback(message: str)\\n +update_attempts(attempts: int)\\n +update_history(history: list)\\n +get_difficulty_selection() str\\n +get_guess_from_user() int\\n }\\n class Main {\\n +main()\\n }\\n Main --> UI\\n UI --> Game\\n UI --> GUI\\n GUI --> Game\\n\",\n \"Refined Program call flow\": \"\\nsequenceDiagram\\n participant M as Main\\n participant UI as UI\\n participant G as Game\\n participant GUI as GUI\\n M->>UI: start()\\n UI->>GUI: render_main_window()\\n GUI->>GUI: get_difficulty_selection()\\n GUI-->>G: __init__(difficulty)\\n G->>G: start_game()\\n loop Game Loop\\n GUI->>GUI: get_guess_from_user()\\n GUI-->>G: check_guess(guess)\\n G->>GUI: update_feedback(feedback)\\n G->>GUI: update_attempts(attempts)\\n G->>GUI: update_history(history)\\n end\\n G->>GUI: update_feedback(\\\"Correct! Game over.\\\")\\n GUI->>M: main() # Game session ends\\n\",\n \"Anything UNCLEAR\": \"Clarification needed on whether the GUI should support touch input for devices with touch screens, and if so, what gestures need to be supported.\"\n}\n[/CONTENT]", + "\n## context\n\n### Legacy Content\n\n## Required Python packages\n\n- random==2.2.1\n\n## Required Other language third-party packages\n\n- No third-party dependencies required\n\n## Logic Analysis\n\n- ['game.py', 'Contains Game class with methods __init__, start_game, check_guess, get_attempts, get_history and uses random library for generating secret_number']\n- ['ui.py', 'Contains UI class with methods start, display_message, get_user_input, show_attempts, show_history, select_difficulty and interacts with Game class']\n- ['main.py', 'Contains Main class with method main that initializes UI class and starts the game loop']\n\n## Task list\n\n- game.py\n- ui.py\n- main.py\n\n## Full API spec\n\n\n\n## Shared Knowledge\n\n`game.py` contains the core game logic and is used by `ui.py` to interact with the user. `main.py` serves as the entry point to start the game.\n\n## Anything UNCLEAR\n\nThe requirement analysis suggests the need for a clean and intuitive interface. Since we are using a command-line interface, we need to ensure that the text-based UI is as user-friendly as possible. Further clarification on whether a graphical user interface (GUI) is expected in the future would be helpful for planning the extendability of the game.\n\n### New Requirements\n{'Refined Implementation Approach': 'To accommodate the new graphical user interface (GUI) requirements, we will leverage the Tkinter library, which is included with Python and supports the creation of a user-friendly GUI. The game logic will remain in Python, with Tkinter handling the rendering of the interface. We will ensure that the GUI is responsive and provides immediate visual feedback. The main game loop will be event-driven, responding to user inputs such as button clicks and difficulty selection.', 'Refined File list': ['main.py', 'game.py', 'ui.py', 'gui.py'], 'Refined Data structures and interfaces': '\\nclassDiagram\\n class Game {\\n -int secret_number\\n -int min_range\\n -int max_range\\n -list attempts\\n +__init__(difficulty: str)\\n +start_game()\\n +check_guess(guess: int) str\\n +get_attempts() int\\n +get_history() list\\n }\\n class UI {\\n +start()\\n +display_message(message: str)\\n +get_user_input(prompt: str) str\\n +show_attempts(attempts: int)\\n +show_history(history: list)\\n +select_difficulty() str\\n }\\n class GUI {\\n +__init__()\\n +setup_window()\\n +bind_events()\\n +update_feedback(message: str)\\n +update_attempts(attempts: int)\\n +update_history(history: list)\\n +show_difficulty_selector()\\n +animate_guess_result(correct: bool)\\n }\\n class Main {\\n +main()\\n }\\n Main --> UI\\n UI --> Game\\n UI --> GUI\\n GUI --> Game\\n', 'Refined Program call flow': '\\nsequenceDiagram\\n participant M as Main\\n participant UI as UI\\n participant G as Game\\n participant GU as GUI\\n M->>UI: start()\\n UI->>GU: setup_window()\\n GU->>GU: bind_events()\\n GU->>UI: select_difficulty()\\n UI-->>G: __init__(difficulty)\\n G->>G: start_game()\\n loop Game Loop\\n GU->>GU: show_difficulty_selector()\\n GU->>UI: get_user_input(\"Enter your guess:\")\\n UI-->>G: check_guess(guess)\\n G->>GU: update_feedback(feedback)\\n G->>GU: update_attempts(attempts)\\n G->>GU: update_history(history)\\n GU->>GU: animate_guess_result(correct)\\n end\\n G->>GU: update_feedback(\"Correct! Game over.\")\\n GU->>M: main() # Game session ends\\n', 'Anything UNCLEAR': ''}\n\n\n-----\n\n## format example\n[CONTENT]\n{\n \"Required Python packages\": [\n \"flask==1.1.2\",\n \"bcrypt==3.2.0\"\n ],\n \"Required Other language third-party packages\": [\n \"No third-party dependencies required\"\n ],\n \"Refined Logic Analysis\": [\n [\n \"game.py\",\n \"Contains Game class and ... functions\"\n ],\n [\n \"main.py\",\n \"Contains main function, from game import Game\"\n ],\n [\n \"new_feature.py\",\n \"Introduces NewFeature class and related functions\"\n ],\n [\n \"utils.py\",\n \"Modifies existing utility functions to support incremental changes\"\n ]\n ],\n \"Refined Task list\": [\n \"new_feature.py\",\n \"utils\",\n \"game.py\",\n \"main.py\"\n ],\n \"Full API spec\": \"openapi: 3.0.0 ...\",\n \"Refined Shared Knowledge\": \"`new_module.py` enhances shared utility functions for improved code reusability and collaboration.\",\n \"Anything UNCLEAR\": \"Clarification needed on how to start and initialize third-party libraries.\"\n}\n[/CONTENT]\n\n## nodes: \": # \"\n- Required Python packages: typing.List[str] # Provide required Python packages in requirements.txt format.\n- Required Other language third-party packages: typing.List[str] # List down the required packages for languages other than Python.\n- Refined Logic Analysis: typing.List[typing.List[str]] # Review and refine the logic analysis by merging the Legacy Content and Incremental Content. Provide a comprehensive list of files with classes/methods/functions to be implemented or modified incrementally. Include dependency analysis, consider potential impacts on existing code, and document necessary imports.\n- Refined Task list: typing.List[str] # Review and refine the combined task list after the merger of Legacy Content and Incremental Content, and consistent with Refined File List. Ensure that tasks are organized in a logical and prioritized order, considering dependencies for a streamlined and efficient development process. \n- Full API spec: # Describe all APIs using OpenAPI 3.0 spec that may be used by both frontend and backend. If front-end and back-end communication is not required, leave it blank.\n- Refined Shared Knowledge: # Update and expand shared knowledge to reflect any new elements introduced. This includes common utility functions, configuration variables for team collaboration. Retain content that is not related to incremental development but important for consistency and clarity.\n- Anything UNCLEAR: # Mention any unclear aspects in the project management context and try to clarify them.\n\n\n## constraint\nLanguage: Please use the same language as Human INPUT.\nFormat: output wrapped inside [CONTENT][/CONTENT] like format example, nothing else.\n\n## action\nFollow instructions of nodes, generate output and make sure it follows the format example.\n": "[CONTENT]\n{\n \"Required Python packages\": [\n \"random==2.2.1\",\n \"tkinter==8.6\"\n ],\n \"Required Other language third-party packages\": [\n \"No third-party dependencies required\"\n ],\n \"Refined Logic Analysis\": [\n [\n \"game.py\",\n \"Contains Game class with methods __init__, start_game, check_guess, get_attempts, get_history and uses random library for generating secret_number\"\n ],\n [\n \"ui.py\",\n \"Contains UI class with methods start, display_message, get_user_input, show_attempts, show_history, select_difficulty and interacts with Game class\"\n ],\n [\n \"gui.py\",\n \"Contains GUI class with methods __init__, setup_window, bind_events, update_feedback, update_attempts, update_history, show_difficulty_selector, animate_guess_result and interacts with Game class\"\n ],\n [\n \"main.py\",\n \"Contains Main class with method main that initializes UI class and starts the game loop\"\n ]\n ],\n \"Refined Task list\": [\n \"game.py\",\n \"ui.py\",\n \"gui.py\",\n \"main.py\"\n ],\n \"Full API spec\": \"\",\n \"Refined Shared Knowledge\": \"`game.py` contains the core game logic and is used by `ui.py` to interact with the user. `main.py` serves as the entry point to start the game. `gui.py` will handle the graphical user interface using the Tkinter library, providing a responsive and user-friendly interface for the game.\",\n \"Anything UNCLEAR\": \"\"\n}\n[/CONTENT]", + "\nNOTICE\nRole: You are a professional engineer; The main goal is to complete incremental development by combining legacy code and plan and Incremental Change, ensuring the integration of new features.\n\n# Context\n## User New Requirements\n\n\n## Code Plan And Change\n{\"Development Plan\": [\"Develop the GUI using Tkinter to replace the command-line interface. Start by setting up the main window and event handling. Then, add widgets for displaying the game status, results, and feedback. Implement interactive elements for difficulty selection and visualize the guess history. Finally, create animations for guess feedback and ensure responsiveness across different screen sizes.\", \"Modify the main.py to initialize the GUI and start the event-driven game loop. Ensure that the GUI is the primary interface for user interaction.\"], \"Incremental Change\": [\"```diff\\nclass GUI:\\n- pass\\n+ def __init__(self):\\n+ self.setup_window()\\n+\\n+ def setup_window(self):\\n+ # Initialize the main window using Tkinter\\n+ pass\\n+\\n+ def bind_events(self):\\n+ # Bind button clicks and other events\\n+ pass\\n+\\n+ def update_feedback(self, message: str):\\n+ # Update the feedback label with the given message\\n+ pass\\n+\\n+ def update_attempts(self, attempts: int):\\n+ # Update the attempts label with the number of attempts\\n+ pass\\n+\\n+ def update_history(self, history: list):\\n+ # Update the history view with the list of past guesses\\n+ pass\\n+\\n+ def show_difficulty_selector(self):\\n+ # Show buttons or a dropdown for difficulty selection\\n+ pass\\n+\\n+ def animate_guess_result(self, correct: bool):\\n+ # Trigger an animation for correct or incorrect guesses\\n+ pass\\n```\", \"```diff\\nclass Main:\\n def main(self):\\n- user_interface = UI()\\n- user_interface.start()\\n+ graphical_user_interface = GUI()\\n+ graphical_user_interface.setup_window()\\n+ graphical_user_interface.bind_events()\\n+ # Start the Tkinter main loop\\n+ pass\\n\\n if __name__ == \\\"__main__\\\":\\n main_instance = Main()\\n main_instance.main()\\n```\\n\\n3. Plan for ui.py: Refactor ui.py to work with the new GUI class. Remove command-line interactions and delegate display and input tasks to the GUI.\\n```python\\nclass UI:\\n- def display_message(self, message: str):\\n- print(message)\\n+\\n+ def display_message(self, message: str):\\n+ # This method will now pass the message to the GUI to display\\n+ pass\\n\\n- def get_user_input(self, prompt: str) -> str:\\n- return input(prompt)\\n+\\n+ def get_user_input(self, prompt: str) -> str:\\n+ # This method will now trigger the GUI to get user input\\n+ pass\\n\\n- def show_attempts(self, attempts: int):\\n- print(f\\\"Number of attempts: {attempts}\\\")\\n+\\n+ def show_attempts(self, attempts: int):\\n+ # This method will now update the GUI with the number of attempts\\n+ pass\\n\\n- def show_history(self, history: list):\\n- print(\\\"Guess history:\\\")\\n- for guess in history:\\n- print(guess)\\n+\\n+ def show_history(self, history: list):\\n+ # This method will now update the GUI with the guess history\\n+ pass\\n```\\n\\n4. Plan for game.py: Ensure game.py remains mostly unchanged as it contains the core game logic. However, make minor adjustments if necessary to integrate with the new GUI.\\n```python\\nclass Game:\\n # No changes required for now\\n```\\n\"]}\n\n## Design\n{\"Refined Implementation Approach\": \"To accommodate the new graphical user interface (GUI) requirements, we will leverage the Tkinter library, which is included with Python and supports the creation of a user-friendly GUI. The game logic will remain in Python, with Tkinter handling the rendering of the interface. We will ensure that the GUI is responsive and provides immediate visual feedback. The main game loop will be event-driven, responding to user inputs such as button clicks and difficulty selection.\", \"Refined File list\": [\"main.py\", \"game.py\", \"ui.py\", \"gui.py\"], \"Refined Data structures and interfaces\": \"\\nclassDiagram\\n class Game {\\n -int secret_number\\n -int min_range\\n -int max_range\\n -list attempts\\n +__init__(difficulty: str)\\n +start_game()\\n +check_guess(guess: int) str\\n +get_attempts() int\\n +get_history() list\\n }\\n class UI {\\n +start()\\n +display_message(message: str)\\n +get_user_input(prompt: str) str\\n +show_attempts(attempts: int)\\n +show_history(history: list)\\n +select_difficulty() str\\n }\\n class GUI {\\n +__init__()\\n +setup_window()\\n +bind_events()\\n +update_feedback(message: str)\\n +update_attempts(attempts: int)\\n +update_history(history: list)\\n +show_difficulty_selector()\\n +animate_guess_result(correct: bool)\\n }\\n class Main {\\n +main()\\n }\\n Main --> UI\\n UI --> Game\\n UI --> GUI\\n GUI --> Game\\n\", \"Refined Program call flow\": \"\\nsequenceDiagram\\n participant M as Main\\n participant UI as UI\\n participant G as Game\\n participant GU as GUI\\n M->>UI: start()\\n UI->>GU: setup_window()\\n GU->>GU: bind_events()\\n GU->>UI: select_difficulty()\\n UI-->>G: __init__(difficulty)\\n G->>G: start_game()\\n loop Game Loop\\n GU->>GU: show_difficulty_selector()\\n GU->>UI: get_user_input(\\\"Enter your guess:\\\")\\n UI-->>G: check_guess(guess)\\n G->>GU: update_feedback(feedback)\\n G->>GU: update_attempts(attempts)\\n G->>GU: update_history(history)\\n GU->>GU: animate_guess_result(correct)\\n end\\n G->>GU: update_feedback(\\\"Correct! Game over.\\\")\\n GU->>M: main() # Game session ends\\n\", \"Anything UNCLEAR\": \"\"}\n\n## Task\n{\"Required Python packages\": [\"random==2.2.1\", \"Tkinter==8.6\"], \"Required Other language third-party packages\": [\"No third-party dependencies required\"], \"Refined Logic Analysis\": [[\"game.py\", \"Contains Game class with methods __init__, start_game, check_guess, get_attempts, get_history and uses random library for generating secret_number\"], [\"ui.py\", \"Contains UI class with methods start, display_message, get_user_input, show_attempts, show_history, select_difficulty and interacts with Game class\"], [\"gui.py\", \"Contains GUI class with methods __init__, setup_window, bind_events, update_feedback, update_attempts, update_history, show_difficulty_selector, animate_guess_result and interacts with Game class for GUI rendering\"], [\"main.py\", \"Contains Main class with method main that initializes UI class and starts the event-driven game loop\"]], \"Refined Task list\": [\"game.py\", \"ui.py\", \"gui.py\", \"main.py\"], \"Full API spec\": \"\", \"Refined Shared Knowledge\": \"`game.py` contains the core game logic and is used by `ui.py` to interact with the user. `main.py` serves as the entry point to start the game. `gui.py` is introduced to handle the graphical user interface using Tkinter, which will interact with both `game.py` and `ui.py` for a responsive and user-friendly experience.\", \"Anything UNCLEAR\": \"\"}\n\n## Legacy Code\n```Code\n-----Now, game.py to be rewritten\n```game.py\n\nimport random\n\nclass Game:\n def __init__(self, difficulty: str = 'medium'):\n self.min_range, self.max_range = self._set_difficulty(difficulty)\n self.secret_number = random.randint(self.min_range, self.max_range)\n self.attempts = []\n\n def _set_difficulty(self, difficulty: str):\n difficulties = {\n 'easy': (1, 10),\n 'medium': (1, 100),\n 'hard': (1, 1000)\n }\n return difficulties.get(difficulty, (1, 100))\n\n def start_game(self):\n self.secret_number = random.randint(self.min_range, self.max_range)\n self.attempts = []\n\n def check_guess(self, guess: int) -> str:\n self.attempts.append(guess)\n if guess < self.secret_number:\n return \"It's higher.\"\n elif guess > self.secret_number:\n return \"It's lower.\"\n else:\n return \"Correct! Game over.\"\n\n def get_attempts(self) -> int:\n return len(self.attempts)\n\n def get_history(self) -> list:\n return self.attempts```\n=====\n```\n\n## Debug logs\n```text\n\n\n\n```\n\n## Bug Feedback logs\n```text\n\n```\n\n# Format example\n## Code: game.py\n```python\n## game.py\n...\n```\n\n# Instruction: Based on the context, follow \"Format example\", write or rewrite code.\n## Write/Rewrite Code: Only write one file game.py, write or rewrite complete code using triple quotes based on the following attentions and context.\n1. Only One file: do your best to implement THIS ONLY ONE FILE.\n2. COMPLETE CODE: Your code will be part of the entire project, so please implement complete, reliable, reusable code snippets.\n3. Set default value: If there is any setting, ALWAYS SET A DEFAULT VALUE, ALWAYS USE STRONG TYPE AND EXPLICIT VARIABLE. AVOID circular import.\n4. Follow design: YOU MUST FOLLOW \"Data structures and interfaces\". DONT CHANGE ANY DESIGN. Do not use public member functions that do not exist in your design.\n5. Follow Code Plan And Change: If there is any \"Incremental Change\" that is marked by the git diff format with '+' and '-' symbols, or Legacy Code files contain \"game.py to be rewritten\", you must merge it into the code file according to the \"Development Plan\". \n6. CAREFULLY CHECK THAT YOU DONT MISS ANY NECESSARY CLASS/FUNCTION IN THIS FILE.\n7. Before using a external variable/module, make sure you import it first.\n8. Write out EVERY CODE DETAIL, DON'T LEAVE TODO.\n9. Attention: Retain details that are not related to incremental development but are important for maintaining the consistency and clarity of the old code.\n": "```python\n## game.py\n\nimport random\n\nclass Game:\n def __init__(self, difficulty: str = 'medium'):\n self._min_range, self._max_range = self._set_difficulty(difficulty)\n self._secret_number = random.randint(self._min_range, self._max_range)\n self._attempts = []\n\n def _set_difficulty(self, difficulty: str):\n difficulties = {\n 'easy': (1, 10),\n 'medium': (1, 100),\n 'hard': (1, 1000)\n }\n return difficulties.get(difficulty, (1, 100))\n\n def start_game(self):\n self._secret_number = random.randint(self._min_range, self._max_range)\n self._attempts = []\n\n def check_guess(self, guess: int) -> str:\n self._attempts.append(guess)\n if guess < self._secret_number:\n return \"It's higher.\"\n elif guess > self._secret_number:\n return \"It's lower.\"\n else:\n return \"Correct! Game over.\"\n\n def get_attempts(self) -> int:\n return len(self._attempts)\n\n def get_history(self) -> list:\n return self._attempts\n```", + "\n# System\nRole: You are a professional software engineer, and your main task is to review and revise the code. You need to ensure that the code conforms to the google-style standards, is elegantly designed and modularized, easy to read and maintain.\nLanguage: Please use the same language as the user requirement, but the title and code should be still in English. For example, if the user speaks Chinese, the specific text of your answer should also be in Chinese.\nATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced \"Format example\".\n\n# Context\n## User New Requirements\nNone\n\n## Code Plan And Change\n\n def add(a, b):\n- return a + \n+ return a + b\n \n\n## System Design\n编写一个从a加b的函数,返回a+b\n\n## Task\n\n\n## Code Files\n\n\n\n## Code to be Reviewed: \n```Code\n\n def add(a, b):\n return a + \n \n```\n\n\n\n# Format example 1\n## Code Review: \n1. No, we should fix the logic of class A due to ...\n2. ...\n3. ...\n4. No, function B is not implemented, ...\n5. ...\n6. ...\n\n## Actions\n1. Fix the `handle_events` method to update the game state only if a move is successful.\n ```python\n def handle_events(self):\n for event in pygame.event.get():\n if event.type == pygame.QUIT:\n return False\n if event.type == pygame.KEYDOWN:\n moved = False\n if event.key == pygame.K_UP:\n moved = self.game.move('UP')\n elif event.key == pygame.K_DOWN:\n moved = self.game.move('DOWN')\n elif event.key == pygame.K_LEFT:\n moved = self.game.move('LEFT')\n elif event.key == pygame.K_RIGHT:\n moved = self.game.move('RIGHT')\n if moved:\n # Update the game state only if a move was successful\n self.render()\n return True\n ```\n2. Implement function B\n\n## Code Review Result\nLBTM\n\n# Format example 2\n## Code Review: \n1. Yes.\n2. Yes.\n3. Yes.\n4. Yes.\n5. Yes.\n6. Yes.\n\n## Actions\npass\n\n## Code Review Result\nLGTM\n\n\n\n# Instruction: Based on the actual code situation, follow one of the \"Format example\". Return only 1 file under review.\n\n## Code Review: Ordered List. Based on the \"Code to be Reviewed\", provide key, clear, concise, and specific answer. If any answer is no, explain how to fix it step by step.\n1. Is the code implemented as per the requirements? If not, how to achieve it? Analyse it step by step.\n2. Is the code logic completely correct? If there are errors, please indicate how to correct them.\n3. Does the existing code follow the \"Data structures and interfaces\"?\n4. Are all functions implemented? If there is no implementation, please indicate how to achieve it step by step.\n5. Have all necessary pre-dependencies been imported? If not, indicate which ones need to be imported\n6. Are methods from other files being reused correctly?\n\n## Actions: Ordered List. Things that should be done after CR, such as implementing class A and function B\n\n## Code Review Result: str. If the code doesn't have bugs, we don't need to rewrite it, so answer LGTM and stop. ONLY ANSWER LGTM/LBTM.\nLGTM/LBTM\n\n": "## Code Review:\n1. 是的,代码实现了按照要求从a加b的功能。\n2. 不完全正确,代码逻辑存在错误。在`add`函数中,`return`语句没有完整地返回a和b的和,缺少了变量b。\n3. 是的,现有代码遵循了\"数据结构和接口\"的原则。\n4. 所有函数都已实现,但`add`函数的实现不完整。\n5. 由于这是一个简单的加法函数,不需要导入额外的依赖。\n6. 代码中没有使用其他文件的方法。\n\n## Actions:\n1. 修正`add`函数,确保它可以正确返回a和b的和。\n ```python\n def add(a, b):\n return a + b\n ```\n\n## Code Review Result:\nLBTM", + "\n# System\nRole: You are a professional software engineer, and your main task is to review and revise the code. You need to ensure that the code conforms to the google-style standards, is elegantly designed and modularized, easy to read and maintain.\nLanguage: Please use the same language as the user requirement, but the title and code should be still in English. For example, if the user speaks Chinese, the specific text of your answer should also be in Chinese.\nATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced \"Format example\".\n\n# Context\n## User New Requirements\nNone\n\n## Code Plan And Change\n\n def add(a, b):\n- return a + \n+ return a + b\n \n\n## System Design\n编写一个从a加b的函数,返回a+b\n\n## Task\n\n\n## Code Files\n\n\n\n## Code to be Reviewed: \n```Code\n\n def add(a, b):\n return a + \n \n```\n\n## Code Review:\n1. 是的,代码实现了按照要求从a加b的功能。\n2. 不完全正确,代码逻辑存在错误。在`add`函数中,`return`语句没有完整地返回a和b的和,缺少了变量b。\n3. 是的,现有代码遵循了\"数据结构和接口\"的原则。\n4. 所有函数都已实现,但`add`函数的实现不完整。\n5. 由于这是一个简单的加法函数,不需要导入额外的依赖。\n6. 代码中没有使用其他文件的方法。\n\n## Actions:\n1. 修正`add`函数,确保它可以正确返回a和b的和。\n ```python\n def add(a, b):\n return a + b\n ```\n\n## Code Review Result:\nLBTM\n\n# Instruction: rewrite code based on the Code Review and Actions\n## Rewrite Code: CodeBlock. If it still has some bugs, rewrite with triple quotes. Do your utmost to optimize THIS SINGLE FILE. Return all completed codes and prohibit the return of unfinished codes.\n```Code\n## \n...\n```\n": "## 重写代码:代码块\n```python\ndef add(a, b):\n return a + b\n```", + "\n# System\nRole: You are a professional software engineer, and your main task is to review and revise the code. You need to ensure that the code conforms to the google-style standards, is elegantly designed and modularized, easy to read and maintain.\nLanguage: Please use the same language as the user requirement, but the title and code should be still in English. For example, if the user speaks Chinese, the specific text of your answer should also be in Chinese.\nATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced \"Format example\".\n\n# Context\n## User New Requirements\nNone\n\n## Code Plan And Change\n\n def add(a, b):\n- return a + \n+ return a + b\n \n\n## System Design\n编写一个从a加b的函数,返回a+b\n\n## Task\n\n\n## Code Files\n\n\n\n## Code to be Reviewed: \n```Code\ndef add(a, b):\n return a + b\n\n```\n\n\n\n# Format example 1\n## Code Review: \n1. No, we should fix the logic of class A due to ...\n2. ...\n3. ...\n4. No, function B is not implemented, ...\n5. ...\n6. ...\n\n## Actions\n1. Fix the `handle_events` method to update the game state only if a move is successful.\n ```python\n def handle_events(self):\n for event in pygame.event.get():\n if event.type == pygame.QUIT:\n return False\n if event.type == pygame.KEYDOWN:\n moved = False\n if event.key == pygame.K_UP:\n moved = self.game.move('UP')\n elif event.key == pygame.K_DOWN:\n moved = self.game.move('DOWN')\n elif event.key == pygame.K_LEFT:\n moved = self.game.move('LEFT')\n elif event.key == pygame.K_RIGHT:\n moved = self.game.move('RIGHT')\n if moved:\n # Update the game state only if a move was successful\n self.render()\n return True\n ```\n2. Implement function B\n\n## Code Review Result\nLBTM\n\n# Format example 2\n## Code Review: \n1. Yes.\n2. Yes.\n3. Yes.\n4. Yes.\n5. Yes.\n6. Yes.\n\n## Actions\npass\n\n## Code Review Result\nLGTM\n\n\n\n# Instruction: Based on the actual code situation, follow one of the \"Format example\". Return only 1 file under review.\n\n## Code Review: Ordered List. Based on the \"Code to be Reviewed\", provide key, clear, concise, and specific answer. If any answer is no, explain how to fix it step by step.\n1. Is the code implemented as per the requirements? If not, how to achieve it? Analyse it step by step.\n2. Is the code logic completely correct? If there are errors, please indicate how to correct them.\n3. Does the existing code follow the \"Data structures and interfaces\"?\n4. Are all functions implemented? If there is no implementation, please indicate how to achieve it step by step.\n5. Have all necessary pre-dependencies been imported? If not, indicate which ones need to be imported\n6. Are methods from other files being reused correctly?\n\n## Actions: Ordered List. Things that should be done after CR, such as implementing class A and function B\n\n## Code Review Result: str. If the code doesn't have bugs, we don't need to rewrite it, so answer LGTM and stop. ONLY ANSWER LGTM/LBTM.\nLGTM/LBTM\n\n": "## Code Review: \n1. 是的,代码按照要求实现了从a加b的功能。\n2. 是的,代码逻辑完全正确。\n3. 是的,现有代码遵循了“数据结构和接口”原则。\n4. 是的,所有功能都已实现。\n5. 是的,此代码片段不需要额外的依赖导入,因为它使用的是Python的内置操作。\n6. 是的,此代码片段没有从其他文件重用方法,因此不适用。\n\n## Actions\npass\n\n## Code Review Result\nLGTM", + "\n## context\nPlease fix the bug in the code.\n\n-----\n\n## format example\n[CONTENT]\n{\n \"issue_type\": \"BUG\",\n \"reason\": \"...\"\n}\n[/CONTENT]\n\n## nodes: \": # \"\n- issue_type: # Answer BUG/REQUIREMENT. If it is a bugfix, answer BUG, otherwise answer Requirement\n- reason: # Explain the reasoning process from question to answer\n\n\n## constraint\nLanguage: Please use the same language as Human INPUT.\nFormat: output wrapped inside [CONTENT][/CONTENT] like format example, nothing else.\n\n## action\nFollow instructions of nodes, generate output and make sure it follows the format example.\n": "[CONTENT]\n{\n \"issue_type\": \"BUG\",\n \"reason\": \"The user has requested to fix a bug in the code, but has not provided the code or described the bug. Without this information, it is not possible to identify or fix the bug.\"\n}\n[/CONTENT]", + "\n## context\n\n### Legacy Content\n\n## Language\n\nen_us\n\n## Programming Language\n\nPython\n\n## Original Requirements\n\nMake a simple number guessing game\n\n## Product Goals\n\n- Ensure a user-friendly interface for the game\n- Provide a challenging yet enjoyable game experience\n- Design the game to be easily extendable for future features\n\n## User Stories\n\n- As a player, I want to guess numbers and receive feedback on whether my guess is too high or too low\n- As a player, I want to be able to set the difficulty level by choosing the range of possible numbers\n- As a player, I want to see my previous guesses to strategize my next guess\n- As a player, I want to know how many attempts it took me to guess the number once I get it right\n\n## Competitive Analysis\n\n- Guess The Number Game A: Basic text interface, no difficulty levels\n- Number Master B: Has difficulty levels, but cluttered interface\n- Quick Guess C: Sleek design, but lacks performance tracking\n- NumGuess D: Good performance tracking, but not mobile-friendly\n- GuessIt E: Mobile-friendly, but too many ads\n- Perfect Guess F: Offers hints, but the hints are not very helpful\n- SmartGuesser G: Has a learning mode, but lacks a competitive edge\n\n## Competitive Quadrant Chart\n\nquadrantChart\n title \"User Engagement and Game Complexity\"\n x-axis \"Low Complexity\" --> \"High Complexity\"\n y-axis \"Low Engagement\" --> \"High Engagement\"\n quadrant-1 \"Too Simple\"\n quadrant-2 \"Niche Appeal\"\n quadrant-3 \"Complex & Unengaging\"\n quadrant-4 \"Sweet Spot\"\n \"Guess The Number Game A\": [0.2, 0.4]\n \"Number Master B\": [0.5, 0.3]\n \"Quick Guess C\": [0.6, 0.7]\n \"NumGuess D\": [0.4, 0.6]\n \"GuessIt E\": [0.7, 0.5]\n \"Perfect Guess F\": [0.6, 0.4]\n \"SmartGuesser G\": [0.8, 0.6]\n \"Our Target Product\": [0.5, 0.8]\n\n## Requirement Analysis\n\nThe game should be simple yet engaging, allowing players of different skill levels to enjoy it. It should provide immediate feedback and track the player's performance. The game should also be designed with a clean and intuitive interface, and it should be easy to add new features in the future.\n\n## Requirement Pool\n\n- ['P0', 'Implement the core game logic to randomly select a number and allow the user to guess it']\n- ['P0', 'Design a user interface that displays the game status and results clearly']\n- ['P1', 'Add difficulty levels by varying the range of possible numbers']\n- ['P1', 'Keep track of and display the number of attempts for each game session']\n- ['P2', \"Store and show the history of the player's guesses during a game session\"]\n\n## UI Design draft\n\nThe UI will feature a clean and minimalist design with a number input field, submit button, and messages area to provide feedback. There will be options to select the difficulty level and a display showing the number of attempts and history of past guesses.\n\n## Anything UNCLEAR\n\n### New Requirements\n\nAdding graphical interface functionality to enhance the user experience in the number-guessing game. The existing number-guessing game currently relies on command-line input for numbers. The goal is to introduce a graphical interface to improve the game's usability and visual appeal\n\n\n\n-----\n\n## format example\n[CONTENT]\n{\n \"is_relative\": \"YES\",\n \"reason\": \"...\"\n}\n[/CONTENT]\n\n## nodes: \": # \"\n- is_relative: # Answer YES/NO. If the requirement is related to the old PRD, answer YES, otherwise NO\n- reason: # Explain the reasoning process from question to answer\n\n\n## constraint\nLanguage: Please use the same language as Human INPUT.\nFormat: output wrapped inside [CONTENT][/CONTENT] like format example, nothing else.\n\n## action\nFollow instructions of nodes, generate output and make sure it follows the format example.\n": "[CONTENT]\n{\n \"is_relative\": \"YES\",\n \"reason\": \"The new requirement to add a graphical interface functionality is related to the original PRD's goal of ensuring a user-friendly interface for the game. The addition of a graphical interface aligns with the original product goals of providing a challenging yet enjoyable game experience and designing the game to be easily extendable for future features. It specifically addresses the competitive analysis findings by enhancing usability and visual appeal, which were identified as shortcomings in some of the competitive products.\"\n}\n[/CONTENT]", + "\n## context\n\n### Legacy Content\n\n## Language\n\nen_us\n\n## Programming Language\n\nPython\n\n## Original Requirements\n\nMake a simple number guessing game\n\n## Product Goals\n\n- Ensure a user-friendly interface for the game\n- Provide a challenging yet enjoyable game experience\n- Design the game to be easily extendable for future features\n\n## User Stories\n\n- As a player, I want to guess numbers and receive feedback on whether my guess is too high or too low\n- As a player, I want to be able to set the difficulty level by choosing the range of possible numbers\n- As a player, I want to see my previous guesses to strategize my next guess\n- As a player, I want to know how many attempts it took me to guess the number once I get it right\n\n## Competitive Analysis\n\n- Guess The Number Game A: Basic text interface, no difficulty levels\n- Number Master B: Has difficulty levels, but cluttered interface\n- Quick Guess C: Sleek design, but lacks performance tracking\n- NumGuess D: Good performance tracking, but not mobile-friendly\n- GuessIt E: Mobile-friendly, but too many ads\n- Perfect Guess F: Offers hints, but the hints are not very helpful\n- SmartGuesser G: Has a learning mode, but lacks a competitive edge\n\n## Competitive Quadrant Chart\n\nquadrantChart\n title \"User Engagement and Game Complexity\"\n x-axis \"Low Complexity\" --> \"High Complexity\"\n y-axis \"Low Engagement\" --> \"High Engagement\"\n quadrant-1 \"Too Simple\"\n quadrant-2 \"Niche Appeal\"\n quadrant-3 \"Complex & Unengaging\"\n quadrant-4 \"Sweet Spot\"\n \"Guess The Number Game A\": [0.2, 0.4]\n \"Number Master B\": [0.5, 0.3]\n \"Quick Guess C\": [0.6, 0.7]\n \"NumGuess D\": [0.4, 0.6]\n \"GuessIt E\": [0.7, 0.5]\n \"Perfect Guess F\": [0.6, 0.4]\n \"SmartGuesser G\": [0.8, 0.6]\n \"Our Target Product\": [0.5, 0.8]\n\n## Requirement Analysis\n\nThe game should be simple yet engaging, allowing players of different skill levels to enjoy it. It should provide immediate feedback and track the player's performance. The game should also be designed with a clean and intuitive interface, and it should be easy to add new features in the future.\n\n## Requirement Pool\n\n- ['P0', 'Implement the core game logic to randomly select a number and allow the user to guess it']\n- ['P0', 'Design a user interface that displays the game status and results clearly']\n- ['P1', 'Add difficulty levels by varying the range of possible numbers']\n- ['P1', 'Keep track of and display the number of attempts for each game session']\n- ['P2', \"Store and show the history of the player's guesses during a game session\"]\n\n## UI Design draft\n\nThe UI will feature a clean and minimalist design with a number input field, submit button, and messages area to provide feedback. There will be options to select the difficulty level and a display showing the number of attempts and history of past guesses.\n\n## Anything UNCLEAR\n\n### New Requirements\n\nAdding graphical interface functionality to enhance the user experience in the number-guessing game. The existing number-guessing game currently relies on command-line input for numbers. The goal is to introduce a graphical interface to improve the game's usability and visual appeal\n\n\n\n-----\n\n## format example\n[CONTENT]\n{\n \"Language\": \"en_us\",\n \"Programming Language\": \"Python\",\n \"Refined Requirements\": \"Create a 2048 game with a new feature that ...\",\n \"Project Name\": \"game_2048\",\n \"Refined Product Goals\": [\n \"Enhance user engagement through new features\",\n \"Optimize performance for scalability\",\n \"Integrate innovative UI enhancements\"\n ],\n \"Refined User Stories\": [\n \"As a player, I want to choose difficulty levels to challenge my skills\",\n \"As a player, I want a visually appealing score display after each game for a better gaming experience\",\n \"As a player, I want a convenient restart button displayed when I lose to quickly start a new game\",\n \"As a player, I want an enhanced and aesthetically pleasing UI to elevate the overall gaming experience\",\n \"As a player, I want the ability to play the game seamlessly on my mobile phone for on-the-go entertainment\"\n ],\n \"Competitive Analysis\": [\n \"2048 Game A: Simple interface, lacks responsive features\",\n \"play2048.co: Beautiful and responsive UI with my best score shown\",\n \"2048game.com: Responsive UI with my best score shown, but many ads\"\n ],\n \"Competitive Quadrant Chart\": \"quadrantChart\\n title \\\"Reach and engagement of campaigns\\\"\\n x-axis \\\"Low Reach\\\" --> \\\"High Reach\\\"\\n y-axis \\\"Low Engagement\\\" --> \\\"High Engagement\\\"\\n quadrant-1 \\\"We should expand\\\"\\n quadrant-2 \\\"Need to promote\\\"\\n quadrant-3 \\\"Re-evaluate\\\"\\n quadrant-4 \\\"May be improved\\\"\\n \\\"Campaign A\\\": [0.3, 0.6]\\n \\\"Campaign B\\\": [0.45, 0.23]\\n \\\"Campaign C\\\": [0.57, 0.69]\\n \\\"Campaign D\\\": [0.78, 0.34]\\n \\\"Campaign E\\\": [0.40, 0.34]\\n \\\"Campaign F\\\": [0.35, 0.78]\\n \\\"Our Target Product\\\": [0.5, 0.6]\",\n \"Refined Requirement Analysis\": [\n \"Require add/update/modify ...\"\n ],\n \"Refined Requirement Pool\": [\n [\n \"P0\",\n \"The main code ...\"\n ],\n [\n \"P0\",\n \"The game algorithm ...\"\n ]\n ],\n \"UI Design draft\": \"Basic function description with a simple style and layout.\",\n \"Anything UNCLEAR\": \"\"\n}\n[/CONTENT]\n\n## nodes: \": # \"\n- Language: # Provide the language used in the project, typically matching the user's requirement language.\n- Programming Language: # Python/JavaScript or other mainstream programming language.\n- Refined Requirements: # Place the New user's original requirements here.\n- Project Name: # According to the content of \"Original Requirements,\" name the project using snake case style , like 'game_2048' or 'simple_crm.\n- Refined Product Goals: typing.List[str] # Update and expand the original product goals to reflect the evolving needs due to incremental development. Ensure that the refined goals align with the current project direction and contribute to its success.\n- Refined User Stories: typing.List[str] # Update and expand the original scenario-based user stories to reflect the evolving needs due to incremental development. Ensure that the refined user stories capture incremental features and improvements. \n- Competitive Analysis: typing.List[str] # Provide 5 to 7 competitive products.\n- Competitive Quadrant Chart: # Use mermaid quadrantChart syntax. Distribute scores evenly between 0 and 1\n- Refined Requirement Analysis: typing.List[str] # Review and refine the existing requirement analysis to align with the evolving needs of the project due to incremental development. Ensure the analysis comprehensively covers the new features and enhancements required for the refined project scope.\n- Refined Requirement Pool: typing.List[typing.List[str]] # List down the top 5 to 7 requirements with their priority (P0, P1, P2). Cover both legacy content and incremental content. Retain content unrelated to incremental development\n- UI Design draft: # Provide a simple description of UI elements, functions, style, and layout.\n- Anything UNCLEAR: # Mention any aspects of the project that are unclear and try to clarify them.\n\n\n## constraint\nLanguage: Please use the same language as Human INPUT.\nFormat: output wrapped inside [CONTENT][/CONTENT] like format example, nothing else.\n\n## action\nFollow instructions of nodes, generate output and make sure it follows the format example.\n": "[CONTENT]\n{\n \"Language\": \"en_us\",\n \"Programming Language\": \"Python\",\n \"Refined Requirements\": \"Adding graphical interface functionality to enhance the user experience in the number-guessing game. The existing number-guessing game currently relies on command-line input for numbers. The goal is to introduce a graphical interface to improve the game's usability and visual appeal.\",\n \"Project Name\": \"graphical_number_guesser\",\n \"Refined Product Goals\": [\n \"Introduce a graphical user interface to make the game more accessible and visually appealing\",\n \"Maintain a user-friendly experience while transitioning from a command-line interface to a graphical interface\",\n \"Ensure the game remains challenging and enjoyable with the addition of the new interface\",\n \"Design the graphical interface to be easily extendable for future enhancements\"\n ],\n \"Refined User Stories\": [\n \"As a player, I want to interact with a graphical interface to input my guesses and receive feedback\",\n \"As a player, I want to easily select difficulty levels through the graphical interface\",\n \"As a player, I want to see a visual representation of my previous guesses and the number of attempts\",\n \"As a player, I want to enjoy a visually engaging experience that enhances the overall gameplay\"\n ],\n \"Competitive Analysis\": [\n \"Guess The Number Game A: Basic text interface, no difficulty levels\",\n \"Number Master B: Has difficulty levels, but cluttered interface\",\n \"Quick Guess C: Sleek design, but lacks performance tracking\",\n \"NumGuess D: Good performance tracking, but not mobile-friendly\",\n \"GuessIt E: Mobile-friendly, but too many ads\",\n \"Perfect Guess F: Offers hints, but the hints are not very helpful\",\n \"SmartGuesser G: Has a learning mode, but lacks a competitive edge\",\n \"Graphical Number Guesser: Our new game with a graphical interface and user-friendly design\"\n ],\n \"Competitive Quadrant Chart\": \"quadrantChart\\n title \\\"User Engagement and Game Complexity\\\"\\n x-axis \\\"Low Complexity\\\" --> \\\"High Complexity\\\"\\n y-axis \\\"Low Engagement\\\" --> \\\"High Engagement\\\"\\n quadrant-1 \\\"Too Simple\\\"\\n quadrant-2 \\\"Niche Appeal\\\"\\n quadrant-3 \\\"Complex & Unengaging\\\"\\n quadrant-4 \\\"Sweet Spot\\\"\\n \\\"Guess The Number Game A\\\": [0.2, 0.4]\\n \\\"Number Master B\\\": [0.5, 0.3]\\n \\\"Quick Guess C\\\": [0.6, 0.7]\\n \\\"NumGuess D\\\": [0.4, 0.6]\\n \\\"GuessIt E\\\": [0.7, 0.5]\\n \\\"Perfect Guess F\\\": [0.6, 0.4]\\n \\\"SmartGuesser G\\\": [0.8, 0.6]\\n \\\"Graphical Number Guesser\\\": [0.5, 0.8]\",\n \"Refined Requirement Analysis\": [\n \"The game must provide an intuitive graphical interface for user interaction\",\n \"The difficulty level selection should be seamlessly integrated into the graphical interface\",\n \"Performance tracking must be visually represented within the game interface\",\n \"The game should be designed to allow for easy updates and feature additions\"\n ],\n \"Refined Requirement Pool\": [\n [\"P0\", \"Implement a graphical user interface for the game\"],\n [\"P0\", \"Ensure the graphical interface provides feedback on guesses\"],\n [\"P1\", \"Incorporate difficulty level selection into the graphical interface\"],\n [\"P1\", \"Display a visual representation of guess history and attempt count\"],\n [\"P2\", \"Design the interface to be extensible for future game features\"]\n ],\n \"UI Design draft\": \"The graphical interface will feature a main game window with an input field for number guesses, buttons for submitting guesses and selecting difficulty, and panels for displaying guess history, attempt count, and feedback messages.\",\n \"Anything UNCLEAR\": \"\"\n}\n[/CONTENT]" } \ No newline at end of file diff --git a/tests/metagpt/actions/mock_json.py b/tests/metagpt/actions/mock_json.py index 875d74d3c..2b354ca6f 100644 --- a/tests/metagpt/actions/mock_json.py +++ b/tests/metagpt/actions/mock_json.py @@ -37,7 +37,7 @@ DESIGN = { } -TASKS = { +TASK = { "Required Python packages": ["pygame==2.0.1"], "Required Other language third-party packages": ["No third-party dependencies required"], "Logic Analysis": [ diff --git a/tests/metagpt/actions/test_design_api.py b/tests/metagpt/actions/test_design_api.py index 7d3efa7ff..9924a2e84 100644 --- a/tests/metagpt/actions/test_design_api.py +++ b/tests/metagpt/actions/test_design_api.py @@ -9,8 +9,10 @@ import pytest from metagpt.actions.design_api import WriteDesign +from metagpt.llm import LLM from metagpt.logs import logger from metagpt.schema import Message +from tests.data.incremental_dev_project.mock import DESIGN_SAMPLE, REFINED_PRD_JSON @pytest.mark.asyncio @@ -25,3 +27,16 @@ async def test_design_api(context): logger.info(result) assert result + + +@pytest.mark.asyncio +async def test_refined_design_api(context): + await context.repo.docs.prd.save(filename="1.txt", content=str(REFINED_PRD_JSON)) + await context.repo.docs.system_design.save(filename="1.txt", content=DESIGN_SAMPLE) + + design_api = WriteDesign(context=context, llm=LLM()) + + result = await design_api.run(Message(content="", instruct_content=None)) + logger.info(result) + + assert result diff --git a/tests/metagpt/actions/test_project_management.py b/tests/metagpt/actions/test_project_management.py index f3bb405ca..5d0d11efb 100644 --- a/tests/metagpt/actions/test_project_management.py +++ b/tests/metagpt/actions/test_project_management.py @@ -9,13 +9,19 @@ import pytest from metagpt.actions.project_management import WriteTasks +from metagpt.llm import LLM from metagpt.logs import logger from metagpt.schema import Message +from tests.data.incremental_dev_project.mock import ( + REFINED_DESIGN_JSON, + REFINED_PRD_JSON, + TASK_SAMPLE, +) from tests.metagpt.actions.mock_json import DESIGN, PRD @pytest.mark.asyncio -async def test_design_api(context): +async def test_task(context): await context.repo.docs.prd.save("1.txt", content=str(PRD)) await context.repo.docs.system_design.save("1.txt", content=str(DESIGN)) logger.info(context.git_repo) @@ -26,3 +32,19 @@ async def test_design_api(context): logger.info(result) assert result + + +@pytest.mark.asyncio +async def test_refined_task(context): + await context.repo.docs.prd.save("2.txt", content=str(REFINED_PRD_JSON)) + await context.repo.docs.system_design.save("2.txt", content=str(REFINED_DESIGN_JSON)) + await context.repo.docs.task.save("2.txt", content=TASK_SAMPLE) + + logger.info(context.git_repo) + + action = WriteTasks(context=context, llm=LLM()) + + result = await action.run(Message(content="", instruct_content=None)) + logger.info(result) + + assert result diff --git a/tests/metagpt/actions/test_project_management_an.py b/tests/metagpt/actions/test_project_management_an.py index ddbb56569..5a65e50c9 100644 --- a/tests/metagpt/actions/test_project_management_an.py +++ b/tests/metagpt/actions/test_project_management_an.py @@ -10,13 +10,14 @@ from openai._models import BaseModel from metagpt.actions.action_node import ActionNode, dict_to_markdown from metagpt.actions.project_management import NEW_REQ_TEMPLATE -from metagpt.actions.project_management_an import REFINED_PM_NODE +from metagpt.actions.project_management_an import PM_NODE, REFINED_PM_NODE from metagpt.llm import LLM from tests.data.incremental_dev_project.mock import ( REFINED_DESIGN_JSON, - REFINED_TASKS_JSON, - TASKS_SAMPLE, + REFINED_TASK_JSON, + TASK_SAMPLE, ) +from tests.metagpt.actions.mock_json import TASK @pytest.fixture() @@ -24,20 +25,40 @@ def llm(): return LLM() -def mock_refined_tasks_json(): - return REFINED_TASKS_JSON +def mock_refined_task_json(): + return REFINED_TASK_JSON + + +def mock_task_json(): + return TASK @pytest.mark.asyncio async def test_project_management_an(mocker): + root = ActionNode.from_children( + "ProjectManagement", [ActionNode(key="", expected_type=str, instruction="", example="")] + ) + root.instruct_content = BaseModel() + root.instruct_content.model_dump = mock_task_json + mocker.patch("metagpt.actions.project_management_an.PM_NODE.fill", return_value=root) + + node = await PM_NODE.fill(dict_to_markdown(REFINED_DESIGN_JSON), llm) + + assert "Logic Analysis" in node.instruct_content.model_dump() + assert "Task list" in node.instruct_content.model_dump() + assert "Shared Knowledge" in node.instruct_content.model_dump() + + +@pytest.mark.asyncio +async def test_project_management_an_inc(mocker): root = ActionNode.from_children( "RefinedProjectManagement", [ActionNode(key="", expected_type=str, instruction="", example="")] ) root.instruct_content = BaseModel() - root.instruct_content.model_dump = mock_refined_tasks_json + root.instruct_content.model_dump = mock_refined_task_json mocker.patch("metagpt.actions.project_management_an.REFINED_PM_NODE.fill", return_value=root) - prompt = NEW_REQ_TEMPLATE.format(old_task=TASKS_SAMPLE, context=dict_to_markdown(REFINED_DESIGN_JSON)) + prompt = NEW_REQ_TEMPLATE.format(old_task=TASK_SAMPLE, context=dict_to_markdown(REFINED_DESIGN_JSON)) node = await REFINED_PM_NODE.fill(prompt, llm) assert "Refined Logic Analysis" in node.instruct_content.model_dump() diff --git a/tests/metagpt/actions/test_write_code.py b/tests/metagpt/actions/test_write_code.py index ee05e0f7d..b5b6e4c52 100644 --- a/tests/metagpt/actions/test_write_code.py +++ b/tests/metagpt/actions/test_write_code.py @@ -6,7 +6,8 @@ @File : test_write_code.py @Modifiled By: mashenquan, 2023-12-6. According to RFC 135 """ - +import json +import uuid from pathlib import Path import pytest @@ -14,7 +15,13 @@ import pytest from metagpt.actions.write_code import WriteCode from metagpt.logs import logger from metagpt.schema import CodingContext, Document -from metagpt.utils.common import aread +from metagpt.utils.common import CodeParser, aread +from tests.data.incremental_dev_project.mock import ( + CODE_PLAN_AND_CHANGE_SAMPLE, + REFINED_CODE_INPUT_SAMPLE, + REFINED_DESIGN_JSON, + REFINED_TASK_JSON, +) from tests.metagpt.actions.mock_markdown import TASKS_2, WRITE_CODE_PROMPT_SAMPLE @@ -81,5 +88,72 @@ async def test_write_code_deps(context): assert rsp.code_doc.content +@pytest.mark.asyncio +async def test_write_refined_code(context): + # Prerequisites + git_dir = Path(__file__).parent / f"unittest/{uuid.uuid4().hex}" + git_dir.mkdir(parents=True, exist_ok=True) + context.config.inc = True + + context.src_workspace = context.git_repo.workdir / "src" + await context.repo.docs.system_design.save(filename="1.json", content=json.dumps(REFINED_DESIGN_JSON)) + await context.repo.docs.task.save(filename="1.json", content=json.dumps(REFINED_TASK_JSON)) + await context.repo.docs.code_plan_and_change.save( + filename="1.json", content=json.dumps(CODE_PLAN_AND_CHANGE_SAMPLE) + ) + + # old_workspace contains the legacy code + context.repo.old_workspace = context.repo.git_repo.workdir / "old" + await context.repo.with_src_path(context.repo.old_workspace).srcs.save( + filename="game.py", content=CodeParser.parse_code(block="", text=REFINED_CODE_INPUT_SAMPLE) + ) + + ccontext = CodingContext( + filename="game.py", + design_doc=await context.repo.docs.system_design.get(filename="1.json"), + task_doc=await context.repo.docs.task.get(filename="1.json"), + code_plan_and_change_doc=await context.repo.docs.code_plan_and_change.get(filename="1.json"), + code_doc=Document(filename="game.py", content="", root_path="src"), + ) + coding_doc = Document(root_path="src", filename="game.py", content=ccontext.json()) + + action = WriteCode(i_context=coding_doc, context=context) + rsp = await action.run() + assert rsp + assert rsp.code_doc.content + + +@pytest.mark.asyncio +async def test_get_codes(context): + # Prerequisites + context.src_workspace = context.git_repo.workdir / "src" + context.repo.old_workspace = context.repo.git_repo.workdir / "old" + for filename in ["game.py", "ui.py"]: + await context.repo.with_src_path(context.src_workspace).srcs.save( + filename=filename, content=f"# {filename}\nnew code ..." + ) + await context.repo.with_src_path(context.repo.old_workspace).srcs.save( + filename=filename, content=f"# {filename}\nlegacy code ..." + ) + + await context.repo.with_src_path(context.repo.old_workspace).srcs.save( + filename="gui.py", content="# gui.py\nlegacy code ..." + ) + await context.repo.with_src_path(context.repo.old_workspace).srcs.save( + filename="main.py", content='# main.py\nif __name__ == "__main__":\n main()' + ) + task_doc = Document(filename="1.json", content=json.dumps(REFINED_TASK_JSON)) + + context.repo = context.repo.with_src_path(context.src_workspace) + # Ready to write gui.py + codes = await WriteCode.get_codes(task_doc=task_doc, exclude="gui.py", project_repo=context.repo) + codes_inc = await WriteCode.get_codes(task_doc=task_doc, exclude="gui.py", project_repo=context.repo, use_inc=True) + + logger.info(codes) + logger.info(codes_inc) + assert codes + assert codes_inc + + if __name__ == "__main__": pytest.main([__file__, "-s"]) diff --git a/tests/metagpt/actions/test_write_code_plan_and_change_an.py b/tests/metagpt/actions/test_write_code_plan_and_change_an.py index e66d97700..f564a677b 100644 --- a/tests/metagpt/actions/test_write_code_plan_and_change_an.py +++ b/tests/metagpt/actions/test_write_code_plan_and_change_an.py @@ -5,6 +5,10 @@ @Author : mannaandpoem @File : test_write_code_plan_and_change_an.py """ +import json +import uuid +from pathlib import Path + import pytest from openai._models import BaseModel @@ -14,14 +18,19 @@ from metagpt.actions.write_code_plan_and_change_an import ( REFINED_TEMPLATE, WriteCodePlanAndChange, ) +from metagpt.logs import logger from metagpt.schema import CodePlanAndChangeContext +from metagpt.utils.common import CodeParser from tests.data.incremental_dev_project.mock import ( CODE_PLAN_AND_CHANGE_SAMPLE, DESIGN_SAMPLE, NEW_REQUIREMENT_SAMPLE, REFINED_CODE_INPUT_SAMPLE, REFINED_CODE_SAMPLE, - TASKS_SAMPLE, + REFINED_DESIGN_JSON, + REFINED_PRD_JSON, + REFINED_TASK_JSON, + TASK_SAMPLE, ) @@ -30,25 +39,39 @@ def mock_code_plan_and_change(): @pytest.mark.asyncio -async def test_write_code_plan_and_change_an(mocker): +async def test_write_code_plan_and_change_an(mocker, context): + # Prerequisites + git_dir = Path(__file__).parent / f"unittest/{uuid.uuid4().hex}" + git_dir.mkdir(parents=True, exist_ok=True) + context.config.inc = True + + context.src_workspace = context.git_repo.workdir / "src" + await context.repo.docs.prd.save(filename="1.json", content=json.dumps(REFINED_PRD_JSON)) + await context.repo.docs.system_design.save(filename="1.json", content=json.dumps(REFINED_DESIGN_JSON)) + await context.repo.docs.task.save(filename="1.json", content=json.dumps(REFINED_TASK_JSON)) + + context.config.project_path = "old" + context.repo.old_workspace = context.repo.git_repo.workdir / "old" + await context.repo.with_src_path(context.repo.old_workspace).srcs.save( + filename="game.py", content=CodeParser.parse_code(block="", text=REFINED_CODE_INPUT_SAMPLE) + ) + root = ActionNode.from_children( "WriteCodePlanAndChange", [ActionNode(key="", expected_type=str, instruction="", example="")] ) root.instruct_content = BaseModel() root.instruct_content.model_dump = mock_code_plan_and_change - mocker.patch("metagpt.actions.write_code_plan_and_change_an.WriteCodePlanAndChange.run", return_value=root) - - requirement = "New requirement" - prd_filename = "prd.md" - design_filename = "design.md" - task_filename = "task.md" - code_plan_and_change_context = CodePlanAndChangeContext( - requirement=requirement, - prd_filename=prd_filename, - design_filename=design_filename, - task_filename=task_filename, + mocker.patch( + "metagpt.actions.write_code_plan_and_change_an.WRITE_CODE_PLAN_AND_CHANGE_NODE.fill", return_value=root ) - node = await WriteCodePlanAndChange(i_context=code_plan_and_change_context).run() + + code_plan_and_change_context = CodePlanAndChangeContext( + requirement="New requirement", + prd_filename="1.json", + design_filename="1.json", + task_filename="1.json", + ) + node = await WriteCodePlanAndChange(i_context=code_plan_and_change_context, context=context).run() assert "Development Plan" in node.instruct_content.model_dump() assert "Incremental Change" in node.instruct_content.model_dump() @@ -61,7 +84,7 @@ async def test_refine_code(mocker): user_requirement=NEW_REQUIREMENT_SAMPLE, code_plan_and_change=CODE_PLAN_AND_CHANGE_SAMPLE, design=DESIGN_SAMPLE, - task=TASKS_SAMPLE, + task=TASK_SAMPLE, code=REFINED_CODE_INPUT_SAMPLE, logs="", feedback="", @@ -70,3 +93,29 @@ async def test_refine_code(mocker): ) code = await WriteCode().write_code(prompt=prompt) assert "def" in code + + +@pytest.mark.asyncio +async def test_get_old_code(context): + git_dir = Path(__file__).parent / f"unittest/{uuid.uuid4().hex}" + git_dir.mkdir(parents=True, exist_ok=True) + + context.config.project_path = "old" + context.repo.old_workspace = context.repo.git_repo.workdir / "old" + await context.repo.with_src_path(context.repo.old_workspace).srcs.save( + filename="game.py", content=REFINED_CODE_INPUT_SAMPLE + ) + + code_plan_and_change_context = CodePlanAndChangeContext( + requirement="New requirement", + prd_filename="1.json", + design_filename="1.json", + task_filename="1.json", + ) + action = WriteCodePlanAndChange(context=context, i_context=code_plan_and_change_context) + + old_codes = await action.get_old_codes() + logger.info(old_codes) + + assert "def" in old_codes + assert "class" in old_codes diff --git a/tests/metagpt/actions/test_write_code_review.py b/tests/metagpt/actions/test_write_code_review.py index a08dd07bc..047d5e6ca 100644 --- a/tests/metagpt/actions/test_write_code_review.py +++ b/tests/metagpt/actions/test_write_code_review.py @@ -32,5 +32,28 @@ def add(a, b): print(f"输出内容: {captured.out}") +@pytest.mark.asyncio +async def test_write_code_review_inc(capfd, context): + context.src_workspace = context.repo.workdir / "srcs" + context.config.inc = True + code = """ + def add(a, b): + return a + + """ + code_plan_and_change = """ + def add(a, b): +- return a + ++ return a + b + """ + coding_context = CodingContext( + filename="math.py", + design_doc=Document(content="编写一个从a加b的函数,返回a+b"), + code_doc=Document(content=code), + code_plan_and_change_doc=Document(content=code_plan_and_change), + ) + + await WriteCodeReview(i_context=coding_context, context=context).run() + + if __name__ == "__main__": pytest.main([__file__, "-s"]) diff --git a/tests/metagpt/actions/test_write_prd.py b/tests/metagpt/actions/test_write_prd.py index 31d20018e..0a2739975 100644 --- a/tests/metagpt/actions/test_write_prd.py +++ b/tests/metagpt/actions/test_write_prd.py @@ -6,6 +6,9 @@ @File : test_write_prd.py @Modified By: mashenquan, 2023-11-1. According to Chapter 2.2.1 and 2.2.2 of RFC 116, replace `handle` with `run`. """ +import uuid +from pathlib import Path + import pytest from metagpt.actions import UserRequirement, WritePRD @@ -15,6 +18,7 @@ from metagpt.roles.product_manager import ProductManager from metagpt.roles.role import RoleReactMode from metagpt.schema import Message from metagpt.utils.common import any_to_str +from tests.data.incremental_dev_project.mock import NEW_REQUIREMENT_SAMPLE, PRD_SAMPLE @pytest.mark.asyncio @@ -34,5 +38,47 @@ async def test_write_prd(new_filename, context): assert product_manager.context.repo.docs.prd.changed_files +@pytest.mark.asyncio +async def test_write_prd_inc(new_filename, context): + git_dir = Path(__file__).parent / f"unittest/{uuid.uuid4().hex}" + git_dir.mkdir(parents=True, exist_ok=True) + + context.src_workspace = context.git_repo.workdir / "src" + await context.repo.docs.prd.save("1.txt", PRD_SAMPLE) + await context.repo.docs.save(filename=REQUIREMENT_FILENAME, content=NEW_REQUIREMENT_SAMPLE) + + action = WritePRD(context=context) + prd = await action.run(Message(content=NEW_REQUIREMENT_SAMPLE, instruct_content=None)) + logger.info(NEW_REQUIREMENT_SAMPLE) + logger.info(prd) + + # Assert the prd is not None or empty + assert prd is not None + assert prd.content != "" + assert "Refined Requirements" in prd.content + + +@pytest.mark.asyncio +async def test_fix_debug(new_filename, context): + git_dir = Path(__file__).parent / f"unittest/{uuid.uuid4().hex}" + git_dir.mkdir(parents=True, exist_ok=True) + + context.src_workspace = context.git_repo.workdir / context.git_repo.workdir.name + + await context.repo.with_src_path(context.src_workspace).srcs.save( + filename="main.py", content='if __name__ == "__main__":\nmain()' + ) + requirements = "Please fix the bug in the code." + await context.repo.docs.save(filename=REQUIREMENT_FILENAME, content=requirements) + action = WritePRD(context=context) + + prd = await action.run(Message(content=requirements, instruct_content=None)) + logger.info(prd) + + # Assert the prd is not None or empty + assert prd is not None + assert prd.content != "" + + if __name__ == "__main__": pytest.main([__file__, "-s"])