Skip to content

Commit 5eefbfa

Browse files
authored
Merge pull request #591 from cecli-dev/v0.100.11
V0.100.11
2 parents c15aad8 + 5180133 commit 5eefbfa

21 files changed

Lines changed: 752 additions & 422 deletions

cecli/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from packaging import version
22

3-
__version__ = "0.100.8.dev"
3+
__version__ = "0.100.11.dev"
44
safe_version = __version__
55

66
try:

cecli/args.py

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,10 @@ def get_parser(default_config_files, git_root):
4343
# List of valid edit formats for argparse validation & shtab completion.
4444
# Dynamically gather them from the registered coder classes so the list
4545
# stays in sync if new formats are added.
46-
from cecli import coders as _cecli_coders
46+
from cecli.coders import EDIT_FORMAT_MAP
47+
48+
edit_format_choices = sorted(EDIT_FORMAT_MAP.keys())
4749

48-
edit_format_choices = sorted(
49-
{
50-
c.edit_format
51-
for c in _cecli_coders.__all__
52-
if hasattr(c, "edit_format") and c.edit_format is not None
53-
}
54-
)
5550
group = parser.add_argument_group("Main model")
5651
group.add_argument(
5752
"files", metavar="FILE", nargs="*", help="files to edit with an LLM (optional)"
@@ -1115,6 +1110,16 @@ def get_parser(default_config_files, git_root):
11151110
" specified, a default command for your OS may be used."
11161111
),
11171112
)
1113+
group.add_argument(
1114+
"--notification-bell",
1115+
action=argparse.BooleanOptionalAction,
1116+
default=True,
1117+
help=(
1118+
"Allow notification commands to produce an audible bell. When enabled, command"
1119+
" output is not suppressed so terminal bell escape sequences can ring through"
1120+
" (default: True)"
1121+
),
1122+
)
11181123
group.add_argument(
11191124
"--command-prefix",
11201125
default=None,

cecli/coders/__init__.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,26 @@
4444
}
4545

4646

47+
EDIT_FORMAT_MAP = {
48+
"help": "HelpCoder",
49+
"ask": "AskCoder",
50+
"diff": "EditBlockCoder",
51+
"diff-fenced": "EditBlockFencedCoder",
52+
"whole": "WholeFileCoder",
53+
"patch": "PatchCoder",
54+
"udiff": "UnifiedDiffCoder",
55+
"udiff-simple": "UnifiedDiffSimpleCoder",
56+
"architect": "ArchitectCoder",
57+
"editor-diff": "EditorEditBlockCoder",
58+
"editor-whole": "EditorWholeFileCoder",
59+
"editor-diff-fenced": "EditorDiffFencedCoder",
60+
"context": "ContextCoder",
61+
"agent": "AgentCoder",
62+
"hashline": "HashLineCoder",
63+
"subagent": "SubAgentCoder",
64+
}
65+
66+
4767
def __getattr__(name):
4868
if name in _MODULE_MAP:
4969
import importlib

cecli/coders/base_coder.py

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -105,28 +105,6 @@ def wrap_fence(name):
105105
wrap_fence("sourcecode"),
106106
]
107107

108-
# Map of edit_format values to coder class names.
109-
# Used by Coder.create() to find the right coder class by edit_format
110-
# without importing all coder modules.
111-
EDIT_FORMAT_MAP = {
112-
"help": "HelpCoder",
113-
"ask": "AskCoder",
114-
"diff": "EditBlockCoder",
115-
"diff-fenced": "EditBlockFencedCoder",
116-
"whole": "WholeFileCoder",
117-
"patch": "PatchCoder",
118-
"udiff": "UnifiedDiffCoder",
119-
"udiff-simple": "UnifiedDiffSimpleCoder",
120-
"architect": "ArchitectCoder",
121-
"editor-diff": "EditorEditBlockCoder",
122-
"editor-whole": "EditorWholeFileCoder",
123-
"editor-diff-fenced": "EditorDiffFencedCoder",
124-
"context": "ContextCoder",
125-
"agent": "AgentCoder",
126-
"hashline": "HashLineCoder",
127-
"subagent": "SubAgentCoder",
128-
}
129-
130108

131109
class UsageMeta(type):
132110
"""Metaclass that provides shared accumulator properties across all Coder subclasses.
@@ -336,6 +314,7 @@ async def create(
336314
uuid=from_coder.uuid,
337315
parent_uuid=from_coder.parent_uuid,
338316
repo=from_coder.repo,
317+
summarizer=from_coder.summarizer,
339318
)
340319
use_kwargs.update(update) # override to complete the switch
341320
use_kwargs.update(kwargs) # override passed kwargs
@@ -351,7 +330,7 @@ async def create(
351330
res = coders.CopyPasteCoder(main_model, io, args=args, **kwargs)
352331

353332
if not res:
354-
coder_name = EDIT_FORMAT_MAP.get(edit_format)
333+
coder_name = coders.EDIT_FORMAT_MAP.get(edit_format)
355334
if coder_name:
356335
coder_cls = getattr(coders, coder_name)
357336
res = coder_cls(main_model, io, args=args, **kwargs)
@@ -373,10 +352,14 @@ async def create(
373352

374353
await res.initialize_mcp_tools()
375354

376-
res.original_kwargs = dict(kwargs)
355+
# Store only small/primitive kwargs to avoid retaining large object references.
356+
# Large objects (repo, mcp_manager, commands, summarizer, file_watcher, etc.)
357+
# are either overridden during clone() or accessible from instance attributes.
358+
_LARGE_KWARGS = {"repo", "mcp_manager", "commands", "summarizer", "file_watcher"}
359+
res.original_kwargs = {k: v for k, v in kwargs.items() if k not in _LARGE_KWARGS}
377360
return res
378361

379-
valid_formats = list(EDIT_FORMAT_MAP.keys())
362+
valid_formats = list(coders.EDIT_FORMAT_MAP.keys())
380363
raise UnknownEditFormat(edit_format, valid_formats)
381364

382365
async def clone(self, **kwargs):

0 commit comments

Comments
 (0)