1010
1111import click
1212
13- from semantic_code_intelligence .config .settings import AppConfig
13+ from semantic_code_intelligence .config .settings import AppConfig , load_config , save_config
1414from semantic_code_intelligence .services .indexing_service import run_indexing
1515from semantic_code_intelligence .utils .logging import (
1616 get_logger ,
@@ -201,7 +201,14 @@ def _on_changes(events: list) -> None:
201201 type = str ,
202202 help = "Switch embedding model and re-index in one step." ,
203203)
204- def index_cmd (project_path : Path | None , force : bool , watch : bool , add_file : str | None , inspect_file : str | None , switch_model : str | None ) -> int :
204+ @click .option (
205+ "--batch-size" ,
206+ "batch_size" ,
207+ type = click .IntRange (1 , None ),
208+ default = None ,
209+ help = "Embedding batch size for chunk processing (overrides config)." ,
210+ )
211+ def index_cmd (project_path : Path | None , force : bool , watch : bool , add_file : str | None , inspect_file : str | None , switch_model : str | None , batch_size : int | None ) -> int :
205212 """Index a codebase for semantic search.
206213
207214 Scans the target directory, extracts code chunks, generates embeddings,
@@ -229,6 +236,8 @@ def index_cmd(project_path: Path | None, force: bool, watch: bool, add_file: str
229236 f"Project not initialized at { root } . Run 'codexa init' first."
230237 )
231238
239+ config : AppConfig | None = None
240+
232241 # --- Inspect mode: show metadata for a file ---
233242 if inspect_file :
234243 _inspect_file_index (root , inspect_file )
@@ -242,10 +251,9 @@ def index_cmd(project_path: Path | None, force: bool, watch: bool, add_file: str
242251 # --- Switch model inline: update config + force re-index ---
243252 if switch_model :
244253 from semantic_code_intelligence .embeddings .model_registry import resolve_model_name
245- from semantic_code_intelligence .config .settings import load_config , save_config
246254
247255 resolved = resolve_model_name (switch_model )
248- config = load_config (root )
256+ config = config if config is not None else load_config (root )
249257 old_model = config .embedding .model_name
250258 if old_model == resolved :
251259 print_info (f"Model already set to '{ resolved } ' — running normal index." )
@@ -255,10 +263,23 @@ def index_cmd(project_path: Path | None, force: bool, watch: bool, add_file: str
255263 print_success (f"Switched model: { old_model } → { resolved } " )
256264 force = True # force re-index with new model
257265
266+ # --- Optional batch size override (only when indexing will run) ---
267+ if batch_size is not None :
268+ config = config if config is not None else load_config (root )
269+ prev_batch = config .embedding .batch_size
270+ if prev_batch != batch_size :
271+ config .embedding .batch_size = batch_size
272+ save_config (config , root )
273+ print_info (
274+ f"Embedding batch size updated: { prev_batch } → { batch_size } "
275+ "(applies to this and future indexing runs)."
276+ )
277+ else :
278+ print_info (f"Embedding batch size already set to { batch_size } ." )
279+
258280 # --- Model consistency guard ---
259281 if not force :
260282 from semantic_code_intelligence .storage .index_manifest import IndexManifest
261- from semantic_code_intelligence .config .settings import load_config
262283 index_dir = AppConfig .index_dir (root )
263284 manifest = IndexManifest .load (index_dir )
264285 if manifest :
0 commit comments