diff --git a/.gitignore b/.gitignore index 0b5b6e5..ce689c2 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,8 @@ __pycache__/ .claude/ *.py[cod] *$py.class -data/ +data/* +!data/default_claude_md .env .env.* diff --git a/data/default_claude_md b/data/default_claude_md new file mode 100644 index 0000000..8a156d6 --- /dev/null +++ b/data/default_claude_md @@ -0,0 +1,6 @@ +# {project_name} + +## Guidelines + +- Before starting any large or complex task, present a plan to the user and wait for approval before proceeding. Do not begin implementation until the user confirms. +- Persist important context, decisions, and project knowledge in this CLAUDE.md file rather than relying solely on session-based memory. diff --git a/src/agent_box/config.py b/src/agent_box/config.py index e0751f9..324bcc9 100644 --- a/src/agent_box/config.py +++ b/src/agent_box/config.py @@ -34,6 +34,9 @@ def weixin_state_dir(self) -> Path: agent_permission_mode: str = "bypassPermissions" agent_max_turns: int | None = None + # Default CLAUDE.md template for new projects + default_claude_md_path: Path = Path(__file__).resolve().parent.parent.parent / "data" / "default_claude_md" + settings = Settings() diff --git a/src/agent_box/session_manager.py b/src/agent_box/session_manager.py index fca8d88..9e1cfc7 100644 --- a/src/agent_box/session_manager.py +++ b/src/agent_box/session_manager.py @@ -60,6 +60,7 @@ def create(self, name: str, agent_type: str | None = None) -> ProjectInfo: project_path = self.workspace / name project_path.mkdir(parents=True, exist_ok=True) + self._init_claude_md(project_path, name) info = ProjectInfo( name=name, @@ -74,6 +75,17 @@ def create(self, name: str, agent_type: str | None = None) -> ProjectInfo: def get(self, name: str) -> ProjectInfo | None: return self._projects.get(name) + def _init_claude_md(self, project_path: Path, name: str) -> None: + target = project_path / "CLAUDE.md" + if target.exists(): + return + template_path = settings.default_claude_md_path + if not template_path.is_file(): + return + content = template_path.read_text().replace("{project_name}", name) + target.write_text(content) + log.info("initialized CLAUDE.md for project %s", name) + def list_all(self) -> list[ProjectInfo]: return list(self._projects.values())