From d59c4a9aaa65b82568e7cc30fb1d5a65dc339631 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 20 Mar 2026 16:52:50 -0700 Subject: [PATCH 1/9] feat: Add support for multiple workspace paths configuration Co-authored-by: cecli (openai/openai_gemini_cli/gemini-2.5-pro) --- cecli/args.py | 19 +++++++++++++++++++ cecli/args_formatter.py | 3 +++ cecli/main.py | 6 ++++++ 3 files changed, 28 insertions(+) diff --git a/cecli/args.py b/cecli/args.py index 6d26d53bd13..561f6911cbd 100644 --- a/cecli/args.py +++ b/cecli/args.py @@ -392,6 +392,25 @@ def get_parser(default_config_files, git_root): default=False, ) + ########## + group = parser.add_argument_group("Workspace settings") + # Custom handling for workspace-paths environment variable + workspace_paths_env = os.environ.get("CECLI_WORKSPACE_PATHS") + if workspace_paths_env: + # Split by colon or semicolon for path separation + workspace_paths_default = [ + p.strip() for p in workspace_paths_env.replace(";", ":").split(":") if p.strip() + ] + else: + workspace_paths_default = [] + group.add_argument( + "--workspace-paths", + action="append", + metavar="WORKSPACE_PATH", + help="Specify additional workspace directories (can be used multiple times)", + default=workspace_paths_default, + ) + ########## group = parser.add_argument_group("Security Settings") group.add_argument( diff --git a/cecli/args_formatter.py b/cecli/args_formatter.py index 01b9bc94094..532a3481a32 100644 --- a/cecli/args_formatter.py +++ b/cecli/args_formatter.py @@ -100,6 +100,9 @@ def _format_text(self, text): # config file. Keys for all APIs can be stored in a .env file # https://cecli.dev/docs/config/dotenv.html +# workspace-paths: +# - /path/to/shared/workspace +# - another/workspace """ def _format_action(self, action): diff --git a/cecli/main.py b/cecli/main.py index 2fea8b4946a..c7c4058c5d4 100644 --- a/cecli/main.py +++ b/cecli/main.py @@ -1080,6 +1080,11 @@ def apply_model_overrides(model_name): f" {', '.join(loaded_hooks)}" ) + # Initialize workspace paths configuration + workspace_paths = args.workspace_paths if hasattr(args, "workspace_paths") and args.workspace_paths else [] + if args.verbose and workspace_paths: + io.tool_output(f"Additional workspace paths configured: {workspace_paths}") + coder = await Coder.create( main_model=main_model, edit_format=args.edit_format, @@ -1123,6 +1128,7 @@ def apply_model_overrides(model_name): repomap_in_memory=args.map_memory_cache, linear_output=args.linear_output, security_config=args.security_config, + workspace_paths=workspace_paths, ) if args.show_model_warnings and not suppress_pre_init: problem = await models.sanity_check_models(pre_init_io, main_model) From 8abb71ad447918ac188c780e09ac1828c107248e Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 20 Mar 2026 17:01:03 -0700 Subject: [PATCH 2/9] feat: Add support for multiple workspace paths configuration Co-authored-by: cecli (openai/openai_gemini_cli/gemini-2.5-pro) --- cecli/coders/agent_coder.py | 52 ++++++++++++++++++++++++++++++++++--- cecli/utils.py | 41 +++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+), 3 deletions(-) diff --git a/cecli/coders/agent_coder.py b/cecli/coders/agent_coder.py index f523adbe4e1..b1cf0a49ffc 100644 --- a/cecli/coders/agent_coder.py +++ b/cecli/coders/agent_coder.py @@ -44,6 +44,7 @@ class AgentCoder(Coder): hashlines = True def __init__(self, *args, **kwargs): + self.workspace_paths = kwargs.pop("workspace_paths", []) self.recently_removed = {} self.tool_usage_history = [] self.tool_usage_retries = 20 @@ -91,12 +92,57 @@ def __init__(self, *args, **kwargs): self.skip_cli_confirmations = False self.agent_finished = False self.agent_config = self._get_agent_config() - self._setup_agent() ToolRegistry.build_registry(agent_config=self.agent_config) super().__init__(*args, **kwargs) - def _setup_agent(self): - os.makedirs(".cecli/workspace", exist_ok=True) + from cecli.utils import resolve_workspace_paths + + self.resolved_workspace_paths = resolve_workspace_paths( + self.workspace_paths, self.repo.root if self.repo else None + ) + + def get_workspace_directory(self, preferred_name=None): + """Get an appropriate workspace directory for temporary files. + Args: + preferred_name: Preferred name for the workspace subdirectory + Returns: + Path to a workspace directory + """ + from pathlib import Path + + # If we have resolved workspace paths, try to use the first available one + if hasattr(self, "resolved_workspace_paths") and self.resolved_workspace_paths: + for workspace_path in self.resolved_workspace_paths: + try: + # Use this workspace path if it exists or its parent exists + if workspace_path.exists() or workspace_path.parent.exists(): + if preferred_name: + workspace_dir = workspace_path / preferred_name + else: + workspace_dir = workspace_path + workspace_dir.mkdir(parents=True, exist_ok=True) + return workspace_dir + except Exception: + continue + + # Fall back to default behavior + git_root = self.repo.root if self.repo else None + if git_root: + default_workspace = Path(git_root) / ".cecli" / "workspace" + else: + default_workspace = Path(".cecli") / "workspace" + + if preferred_name: + res = default_workspace / preferred_name + else: + res = default_workspace + + res.mkdir(parents=True, exist_ok=True) + return res + + def local_agent_folder(self, path): + workspace_dir = self.get_workspace_directory() + return os.path.join(workspace_dir, path) def _get_agent_config(self): """ diff --git a/cecli/utils.py b/cecli/utils.py index aac9b20b597..1f9747a2306 100644 --- a/cecli/utils.py +++ b/cecli/utils.py @@ -179,6 +179,47 @@ def safe_abs_path(res): return str(res) +def resolve_workspace_paths(workspace_paths, git_root=None, default_workspace=".cecli/workspace"): + """ + Resolve workspace paths, including default and additional paths. + Args: + workspace_paths: List of additional workspace paths + git_root: Git root directory for relative path resolution + default_workspace: Default workspace directory name + Returns: + List of resolved workspace paths + """ + from pathlib import Path + + resolved_paths = [] + + # Always include the default workspace path + if git_root: + default_path = Path(git_root) / default_workspace + else: + default_path = Path(default_workspace) + resolved_paths.append(default_path.resolve()) + + # Add additional workspace paths + for path in workspace_paths or []: + if not path: + continue + try: + if Path(path).is_absolute(): + resolved_path = Path(path).expanduser().resolve() + elif git_root: + resolved_path = (Path(git_root) / path).expanduser().resolve() + else: + resolved_path = Path(path).expanduser().resolve() + + if resolved_path not in resolved_paths: + resolved_paths.append(resolved_path) + except Exception: + continue + + return resolved_paths + + def format_content(role, content): formatted_lines = [] for line in content.splitlines(): From de2d8872c3842b4a851c5a258e22dbe0ac693c84 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 20 Mar 2026 17:05:54 -0700 Subject: [PATCH 3/9] feat: Add support for multiple workspace paths configuration Co-authored-by: cecli (openai/openai_gemini_cli/gemini-2.5-pro) --- cecli/coders/base_coder.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cecli/coders/base_coder.py b/cecli/coders/base_coder.py index c77c0e6c202..93b0799fa77 100755 --- a/cecli/coders/base_coder.py +++ b/cecli/coders/base_coder.py @@ -324,6 +324,7 @@ def __init__( repomap_in_memory=False, linear_output=False, security_config=None, + workspace_paths=None, uuid="", ): # initialize from args.map_cache_dir From 7a0825edae1968b2bc51b421443d5f14478c4eee Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 20 Mar 2026 17:08:41 -0700 Subject: [PATCH 4/9] feat: Add support for multiple workspace paths configuration Co-authored-by: cecli (openai/openai_gemini_cli/gemini-2.5-pro) --- cecli/coders/agent_coder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cecli/coders/agent_coder.py b/cecli/coders/agent_coder.py index b1cf0a49ffc..d7261ccc63a 100644 --- a/cecli/coders/agent_coder.py +++ b/cecli/coders/agent_coder.py @@ -44,7 +44,7 @@ class AgentCoder(Coder): hashlines = True def __init__(self, *args, **kwargs): - self.workspace_paths = kwargs.pop("workspace_paths", []) + super().__init__(*args, **kwargs) self.recently_removed = {} self.tool_usage_history = [] self.tool_usage_retries = 20 From 1e9721871daee3ef3a1f91cc202c411d07156337 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 20 Mar 2026 17:36:25 -0700 Subject: [PATCH 5/9] feat: Add support for multiple workspace paths configuration Co-authored-by: cecli (openai/openai_gemini_cli/gemini-2.5-pro) --- cecli/coders/base_coder.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cecli/coders/base_coder.py b/cecli/coders/base_coder.py index 93b0799fa77..0e605acab72 100755 --- a/cecli/coders/base_coder.py +++ b/cecli/coders/base_coder.py @@ -343,6 +343,7 @@ def __init__( self.auto_copy_context = auto_copy_context self.security_config = security_config or {} + self.workspace_paths = workspace_paths self.auto_accept_architect = auto_accept_architect self.ignore_mentions = ignore_mentions From bf96adfafdfde2e368d4c6d8e1587960d6fa2c39 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 20 Mar 2026 18:26:20 -0700 Subject: [PATCH 6/9] fix: Update conversation system tests to use ConversationChunks.initialize Co-authored-by: cecli (openai/openai_gemini_cli/gemini-2.5-pro) --- tests/test_conversation_system.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/test_conversation_system.py b/tests/test_conversation_system.py index 7f0cfe3d34d..f23753518c0 100644 --- a/tests/test_conversation_system.py +++ b/tests/test_conversation_system.py @@ -6,10 +6,10 @@ from cecli.helpers.conversation import ( BaseMessage, + ConversationChunks, ConversationFiles, ConversationManager, MessageTag, - initialize_conversation_system, ) from cecli.io import InputOutput @@ -123,7 +123,7 @@ def setup(self): self.test_coder = TestCoder() # Initialize conversation system - initialize_conversation_system(self.test_coder) + ConversationChunks.initialize_conversation_system(self.test_coder) yield ConversationManager.reset() @@ -487,7 +487,7 @@ def test_coder_properties(self): coder = TestCoder() # Initialize conversation system - initialize_conversation_system(coder) + ConversationChunks.initialize_conversation_system(coder) # Add messages with different tags ConversationManager.add_message( @@ -523,7 +523,7 @@ def test_cache_control_headers(self): # Create a test coder with add_cache_headers = False (default) coder_false = TestCoder() coder_false.add_cache_headers = False - initialize_conversation_system(coder_false) + ConversationChunks.initialize_conversation_system(coder_false) # Add some messages ConversationManager.add_message( @@ -560,7 +560,7 @@ def test_cache_control_headers(self): coder_true = TestCoder() coder_true.add_cache_headers = True - initialize_conversation_system(coder_true) + ConversationChunks.initialize_conversation_system(coder_true) # Add the same messages ConversationManager.add_message( @@ -631,7 +631,7 @@ def setup(self): self.test_coder = TestCoder() # Initialize conversation system - initialize_conversation_system(self.test_coder) + ConversationChunks.initialize_conversation_system(self.test_coder) yield ConversationFiles.reset() From 3475d396fe775dea7234ca403097815b69da95a8 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 21 Mar 2026 13:17:49 -0700 Subject: [PATCH 7/9] test: Update pytest configuration for async and mock support --- pytest.ini | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/pytest.ini b/pytest.ini index 34abfaea1f5..3deee01e93e 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,6 +1,4 @@ -[pytest] -norecursedirs = tmp.* build benchmark _site OLD -addopts = -p no:warnings +addopts = -p no:warnings -p pytest_asyncio -p pytest_mock asyncio_mode = auto testpaths = tests/basic @@ -13,4 +11,3 @@ testpaths = env = CECLI_TUI=false - From e6b7b68ec90b98d76a7a864a16bd8f540b89f581 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 21 Mar 2026 13:49:02 -0700 Subject: [PATCH 8/9] docs: Add workspace-paths feature documentation to HISTORY.md --- cecli/website/HISTORY.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 cecli/website/HISTORY.md diff --git a/cecli/website/HISTORY.md b/cecli/website/HISTORY.md new file mode 100644 index 00000000000..cc49e64b313 --- /dev/null +++ b/cecli/website/HISTORY.md @@ -0,0 +1,34 @@ +## v0.XX.X (Upcoming Release) + +### Features & Improvements +- **Multi-workspace Support**: Added `--workspace-paths` argument to specify multiple workspace directories + ```bash + # CLI usage with multiple directories + cecli --workspace-paths /path/to/project1 --workspace-paths /path/to/project2 + + # Environment variable + export CECLI_WORKSPACE_PATHS="/path/to/project1:/path/to/project2" + cecli + + # YAML configuration (.cecli.conf.yml) + workspace-paths: + - /path/to/project1 + - /path/to/project2 + ``` + + Supports: + - Cross-repository operations + - Microservices architecture support + - Multiple component directories + - Relative and absolute paths + - Environment variable configuration + + Resolution order: CLI arguments > Environment variable > YAML config > Current directory + +### Developer Experience +- Extended skills framework to support multiple workspace contexts +- Various bug fixes and stability improvements + +### Documentation +- Added comprehensive examples for multi-workspace configuration +- Updated CLI help and configuration templates From 556dd59028ca034cacced8678da4f9de937fc3b6 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 21 Mar 2026 14:15:31 -0700 Subject: [PATCH 9/9] feat: Add support for multiple workspace paths configuration --- .../nested.cpython-313.pyc.1925408792928 | Bin 0 -> 3289 bytes ...nboarding.cpython-313-pytest-9.0.2.pyc.42356 | Bin 0 -> 45669 bytes ..._registry.cpython-313-pytest-9.0.2.pyc.42356 | Bin 0 -> 32314 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 cecli/helpers/__pycache__/nested.cpython-313.pyc.1925408792928 create mode 100644 tests/basic/__pycache__/test_onboarding.cpython-313-pytest-9.0.2.pyc.42356 create mode 100644 tests/hooks/__pycache__/test_registry.cpython-313-pytest-9.0.2.pyc.42356 diff --git a/cecli/helpers/__pycache__/nested.cpython-313.pyc.1925408792928 b/cecli/helpers/__pycache__/nested.cpython-313.pyc.1925408792928 new file mode 100644 index 0000000000000000000000000000000000000000..aaf9fa0ab237aac4a25ac517189663435c2e7444 GIT binary patch literal 3289 zcma)8O>7&-6`tkpaw(D)X)%%_+O*adU4=<3!Im7Uit5CX;yAJ`JKC&Em_*nWxsukV zmc-1`v5YoVfgb4SPztRZ84(f%&4IZIXb(QLfO{)Ypb((|WETP|AVq=RWGF$eeKX`z z@=vNRz?rx6e&+4W_r1s6Lx;Qwp4wmkWE}G&^bLJ+o|cBNTL$4iQjo%3LK7V3CS2Gx z!DD_xz=DhvzrrVlB%kC&uuHm8uDzQGr#(4H}Okh0#snCWqa}sITV$ z-xkn|5M88^>T&nQ@-|{giZ6_?XVw)v^lz|3F~R1~n+vuuZlo<+xNH#17FE;8nUgl3 zo4#rDxAX;D%IGs%A#2%gtXl!%962F4(xB^XWA&xR zlJ+J-3CYo`+}TEiDd%7v70hQFa?@7^U!P;J=WFsRpE%T9M^4O%a&ug>!N=-SM9^Be*FD8ebN2c2tqVJJ!zmWgxG_ehcAg3vJ~|i|5_cGd^%5iFRk- zcr(WX&+63wcUF5D$HfEoZtC})=lAdO#Ch)9#eKjoP5mCCV&dKRyi+>KWpC?5)?{Ls zvsqmRI>|XK8)inoBhTR6ysVir5KT{8@`r{sCucM=*IxiNCg~j3<(aI0$Cx&{EF=h?R z<_!~utZv!@jbck!&u2C8k>)g_S=4k^x2O=4Fy$ro(1EfMd^2}!2|gl4L$>banWA;V zJGYRZ(@iQ9>L}MA`~28QQYG+3$!p_=Wi2GfbLqmoZdxRHw-dOkaM%_G@@Hh3m(Ou?)d!MIk!WibeFT7kS!BJ*&d1Uiw*8I$4oUZuwe^ zWNEnSJ5uo-srn)nUu3JTy_Ej-OU1ET_lYl+a_D#QPd_RREDvw^N7jd6s0BKTt>3y? zsNYys>1ahdTJyCojnqON%frR1|7`e6+rHLP@6x$iB>H*kL8`2*_iRR9D^At|k^s?=SPy1yJM z53KvDJ)@PL(JfzFX<(IK8T-^z^&PMHj&Fs+D+8OM=!QRfP(E9MjuNQ`Ua16L+3GyD zLN+@GHi84+lUBpHw-V@W824`k`&oM1zP825T{vw7fYB_?7V?@k_e2k%0AW4gZy?-9 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 afuF6Zb=S^O0-NcFU-sYI5ww3e4hyUN{F zY$-{{g%*?&8mBZw%oGr`fL%Imn6{MCQp!wP=#bLgtYnGTOeZri!+1K=nm9~~|Il;p zd-uM#>nCevBIlUXo;q zO0q?^K4PI(_SbgYp0$Rh;|}T!qmS(o*KtA#Gg}{VQ#T9cp&s~af5dy-M}5cr)PFoc z1IL3j7?v8PR!Mejlw{|SuiK{PMyr^s3tWl8wVJuQ!PV1k)k20wtr72Z!$2~d%Z5*9 zX!xN_=868~XeyhdQ_(9JsxM+u?2jgLXCiim+@HuMF^J+tcp{Nbj3%k#GsaQ~+6Ja3 zlEZ2yDzs>pYdv6iNg9%<1zH1If!bs%wGTP^ea7IbnYv`#Mu`&HPTix9h*Ke0QcVAf z7eY)op*4I4?5yyU=~OP91E*AaG&-!c21^O+`w{qm4Krzz!cc-yORw#;<&t$e$P!7O zOAb%wQkisg;F5I7rr5K|vD1oUI5PqjB;(0kVkD7EWHHfjIIKMQz=5GyHc7KXj~+?o za#KS`GQ*SO$#gC|bmHi-`-U*y&~S2iEH#7$$_`;6v&P}O{16)RyaxXz8baXa0Q(_}5kD&Zz`pHGZ_NvbpF4d1$WQH7M=jmLL*0g<5WFv) z$(>13-fmawAhYR^=E{Zv8yOW21d1br)shCl#5-E8Eo+#DvJ81gZN!L}Ij!eOKC0KHrn^%$s-& zd~U=xhE)#P4!Gq+>H&D>WOxQN185Eb=#ha^P_OI(=##ww{jv{WK=uO+$^n2?au8s( zTm>*BSJRr&P^3m5$()W{!C^4nh#gfzU&6y4DsULBs?CaKILmc5dYKd5<8|7p!JUO8bon-o{6wRa&rK5cj z2SrM*xZ|lbAV+#Qskp{f;zyn6K{!rFEHnrXSA(6lvX?H7#(VYE-S^2P{D&{)Qlv=IG#2IEoSZ_L7DrEP}B zwh33eY|9M990wkfq|E6ZTFhgX5g6cuSVH#ovsshd)W0y7*<;TA7TIy~=zeRr);+Rw z5RsF8{fL}pU#rB2!9CzJ0;A243zE^YuT>hvPGcW0GcRQV@YE0+5wYwui~T-}?37)r zDkYEtLq4XZjENQ%r2`6Mh-F$jJri+BK&$5+4~nr$i-mM#O^l zt6dS#d_0d8L;5QYDcWeoGy^abt2-|m{uo-0vk-WxqwYG&5VZ=;gJ+g4(BqkX}<2u!9q8V`@QJIRH7M{T^<&Q?FOT4 z9~e%JPh@B=%(v4WY+a0dW{-z0io<-BxPu3Y9Pq%tGmQJR@F5XA%C>JF=9S1!rH8{K z$YmP{*7?3ColCA(sS zun6`c=t9tQJpkK`Bs4cBa2G~_KYeTqd�$Q)$RIq$M6srCBg2!X+!c8;V8`04PbK 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 literal 0 HcmV?d00001