diff --git a/CompanyConfig/Art/ChatChainConfig.json b/CompanyConfig/Art/ChatChainConfig.json
index 5b4a0737..49a3d380 100644
--- a/CompanyConfig/Art/ChatChainConfig.json
+++ b/CompanyConfig/Art/ChatChainConfig.json
@@ -116,5 +116,6 @@
"brainstorming": "False",
"gui_design": "True",
"git_management": "False",
- "self_improve": "False"
+ "self_improve": "False",
+ "incremental_develop": "False"
}
\ No newline at end of file
diff --git a/CompanyConfig/Human/ChatChainConfig.json b/CompanyConfig/Human/ChatChainConfig.json
index 3c55eed2..bafc76d6 100644
--- a/CompanyConfig/Human/ChatChainConfig.json
+++ b/CompanyConfig/Human/ChatChainConfig.json
@@ -110,5 +110,6 @@
"brainstorming": "False",
"gui_design": "True",
"git_management": "False",
- "self_improve": "False"
+ "self_improve": "False",
+ "incremental_develop": "False"
}
diff --git a/CompanyConfig/Incremental/ChatChainConfig.json b/CompanyConfig/Incremental/ChatChainConfig.json
new file mode 100644
index 00000000..5dfe1398
--- /dev/null
+++ b/CompanyConfig/Incremental/ChatChainConfig.json
@@ -0,0 +1,96 @@
+{
+ "chain": [
+ {
+ "phase": "DemandAnalysis",
+ "phaseType": "SimplePhase",
+ "max_turn_step": -1,
+ "need_reflect": "True"
+ },
+ {
+ "phase": "LanguageChoose",
+ "phaseType": "SimplePhase",
+ "max_turn_step": -1,
+ "need_reflect": "True"
+ },
+ {
+ "phase": "CodeCompleteAll",
+ "phaseType": "ComposedPhase",
+ "cycleNum": 10,
+ "Composition": [
+ {
+ "phase": "CodeComplete",
+ "phaseType": "SimplePhase",
+ "max_turn_step": 1,
+ "need_reflect": "False"
+ }
+ ]
+ },
+ {
+ "phase": "CodeReview",
+ "phaseType": "ComposedPhase",
+ "cycleNum": 3,
+ "Composition": [
+ {
+ "phase": "CodeReviewComment",
+ "phaseType": "SimplePhase",
+ "max_turn_step": 1,
+ "need_reflect": "False"
+ },
+ {
+ "phase": "CodeReviewModification",
+ "phaseType": "SimplePhase",
+ "max_turn_step": 1,
+ "need_reflect": "False"
+ }
+ ]
+ },
+ {
+ "phase": "Test",
+ "phaseType": "ComposedPhase",
+ "cycleNum": 3,
+ "Composition": [
+ {
+ "phase": "TestErrorSummary",
+ "phaseType": "SimplePhase",
+ "max_turn_step": 1,
+ "need_reflect": "False"
+ },
+ {
+ "phase": "TestModification",
+ "phaseType": "SimplePhase",
+ "max_turn_step": 1,
+ "need_reflect": "False"
+ }
+ ]
+ },
+ {
+ "phase": "EnvironmentDoc",
+ "phaseType": "SimplePhase",
+ "max_turn_step": 1,
+ "need_reflect": "True"
+ },
+ {
+ "phase": "Manual",
+ "phaseType": "SimplePhase",
+ "max_turn_step": 1,
+ "need_reflect": "False"
+ }
+ ],
+ "recruitments": [
+ "Chief Executive Officer",
+ "Counselor",
+ "Chief Human Resource Officer",
+ "Chief Product Officer",
+ "Chief Technology Officer",
+ "Programmer",
+ "Code Reviewer",
+ "Software Test Engineer",
+ "Chief Creative Officer"
+ ],
+ "clear_structure": "True",
+ "brainstorming": "False",
+ "gui_design": "True",
+ "git_management": "False",
+ "self_improve": "False",
+ "incremental_develop": "True"
+}
diff --git a/README.md b/README.md
index cf15db88..d68d8204 100644
--- a/README.md
+++ b/README.md
@@ -26,7 +26,9 @@
## 🎉 News
-* **October 26th, 2023: ChatDev is now supported with Docker for safe execution** (thanks to contribution from [ManindraDeMel](https://github.com/ManindraDeMel)). Please see [Docker Start Guide](wiki.md#docker-start).
+* **November 2nd, 2023: ChatDev is now supported with incremental development.** Try `--config "incremental" --path "Your folder path"` to start it. This mode will start with code review phase base on the existing codes.
+
+* October 26th, 2023: ChatDev is now supported with Docker for safe execution (thanks to contribution from [ManindraDeMel](https://github.com/ManindraDeMel)). Please see [Docker Start Guide](wiki.md#docker-start).
diff --git a/chatdev/chat_chain.py b/chatdev/chat_chain.py
index 5a50652d..61f5d5f5 100644
--- a/chatdev/chat_chain.py
+++ b/chatdev/chat_chain.py
@@ -27,7 +27,8 @@ class ChatChain:
task_prompt: str = None,
project_name: str = None,
org_name: str = None,
- model_type: ModelType = ModelType.GPT_3_5_TURBO) -> None:
+ model_type: ModelType = ModelType.GPT_3_5_TURBO,
+ code_path: str = None) -> None:
"""
Args:
@@ -46,6 +47,7 @@ class ChatChain:
self.project_name = project_name
self.org_name = org_name
self.model_type = model_type
+ self.code_path = code_path
with open(self.config_path, 'r', encoding="utf8") as file:
self.config = json.load(file)
@@ -64,7 +66,8 @@ class ChatChain:
# init ChatEnv
self.chat_env_config = ChatEnvConfig(clear_structure=check_bool(self.config["clear_structure"]),
gui_design=check_bool(self.config["gui_design"]),
- git_management=check_bool(self.config["git_management"]))
+ git_management=check_bool(self.config["git_management"]),
+ incremental_develop=check_bool(self.config["incremental_develop"]))
self.chat_env = ChatEnv(self.chat_env_config)
# the user input prompt will be self-improved (if set "self_improve": "True" in ChatChainConfig.json)
@@ -202,7 +205,19 @@ class ChatChain:
shutil.copy(self.config_phase_path, software_path)
shutil.copy(self.config_role_path, software_path)
- # write task prompt to software path
+ # copy code files to software path in incremental_develop mode
+ if check_bool(self.config["incremental_develop"]):
+ for root, dirs, files in os.walk(self.code_path):
+ relative_path = os.path.relpath(root, self.code_path)
+ target_dir = os.path.join(software_path, 'base', relative_path)
+ os.makedirs(target_dir, exist_ok=True)
+ for file in files:
+ source_file = os.path.join(root, file)
+ target_file = os.path.join(target_dir, file)
+ shutil.copy2(source_file, target_file)
+ self.chat_env._load_from_hardware(os.path.join(software_path, 'base'))
+
+ # write task prompt to software
with open(os.path.join(software_path, self.project_name + ".prompt"), "w") as f:
f.write(self.task_prompt_raw)
@@ -251,7 +266,7 @@ class ChatChain:
git_info = "**[Git Log]**\n\n"
import subprocess
- # 执行git log命令
+ # execute git log
command = "cd {}; git log".format(self.chat_env.env_dict["directory"])
completed_process = subprocess.run(command, shell=True, text=True, stdout=subprocess.PIPE)
diff --git a/chatdev/chat_env.py b/chatdev/chat_env.py
index a986310d..20ccdc62 100644
--- a/chatdev/chat_env.py
+++ b/chatdev/chat_env.py
@@ -18,16 +18,19 @@ from chatdev.utils import log_and_print_online
class ChatEnvConfig:
def __init__(self, clear_structure,
gui_design,
- git_management):
+ git_management,
+ incremental_develop):
self.clear_structure = clear_structure
self.gui_design = gui_design
self.git_management = git_management
+ self.incremental_develop = incremental_develop
def __str__(self):
string = ""
string += "ChatEnvConfig.clear_structure: {}\n".format(self.clear_structure)
string += "ChatEnvConfig.git_management: {}\n".format(self.git_management)
string += "ChatEnvConfig.gui_design: {}\n".format(self.gui_design)
+ string += "ChatEnvConfig.incremental_develop: {}\n".format(self.incremental_develop)
return string
diff --git a/run.py b/run.py
index 6b152803..b92139d6 100644
--- a/run.py
+++ b/run.py
@@ -68,6 +68,8 @@ parser.add_argument('--name', type=str, default="Gomoku",
help="Name of software, your software will be generated in WareHouse/name_org_timestamp")
parser.add_argument('--model', type=str, default="GPT_3_5_TURBO",
help="GPT Model, choose from {'GPT_3_5_TURBO','GPT_4','GPT_4_32K'}")
+parser.add_argument('--path', type=str, default="",
+ help="Your file directory, ChatDev will build upon your software in the Incremental mode")
args = parser.parse_args()
# Start ChatDev
@@ -83,7 +85,8 @@ chat_chain = ChatChain(config_path=config_path,
task_prompt=args.task,
project_name=args.name,
org_name=args.org,
- model_type=args2type[args.model])
+ model_type=args2type[args.model],
+ code_path=args.path)
# ----------------------------------------
# Init Log