tenseleyflow/documentlanguagemodel / 601e857

Browse files

fix(cli): narrow _previously_accepted except + wrap parse_file in train/prompt/export (audit-05 N2/N7)

Authored by espadonne
SHA
601e857f51e37749b5ef7a43fe947332c4038297
Parents
bcdeff2
Tree
f10a83d

1 changed file

StatusFile+-
M src/dlm/cli/commands.py 15 4
src/dlm/cli/commands.pymodified
@@ -142,11 +142,14 @@ def _previously_accepted(store_manifest_path: Path) -> bool:
142142
     """
143143
     if not store_manifest_path.exists():
144144
         return False
145
-    try:
146
-        from dlm.store.manifest import load_manifest
145
+    from dlm.store.errors import ManifestCorruptError
146
+    from dlm.store.manifest import load_manifest
147147
 
148
+    try:
148149
         manifest = load_manifest(store_manifest_path)
149
-    except Exception:
150
+    except (ManifestCorruptError, OSError):
151
+        # Audit-05 N2: narrow from bare `Exception` so programmer bugs
152
+        # propagate instead of being silently treated as "no acceptance."
150153
         return False
151154
     return manifest.license_acceptance is not None
152155
 
@@ -248,6 +251,7 @@ def train_cmd(
248251
 
249252
     from dlm.base_models import GatedModelError
250253
     from dlm.base_models import resolve as resolve_base_model
254
+    from dlm.doc.errors import DlmParseError
251255
     from dlm.doc.parser import parse_file
252256
     from dlm.hardware import doctor
253257
     from dlm.lock import LockMode, LockValidationError
@@ -285,7 +289,11 @@ def train_cmd(
285289
     elif ignore_lock:
286290
         lock_mode = "ignore"
287291
 
288
-    parsed = parse_file(path)
292
+    try:
293
+        parsed = parse_file(path)
294
+    except (DlmParseError, OSError) as exc:
295
+        console.print(f"[red]error:[/red] {exc}")
296
+        raise typer.Exit(code=1) from exc
289297
     try:
290298
         spec = resolve_base_model(
291299
             parsed.frontmatter.base_model,
@@ -378,6 +386,7 @@ def prompt_cmd(
378386
     from rich.console import Console
379387
 
380388
     from dlm.base_models import resolve as resolve_base_model
389
+    from dlm.doc.errors import DlmParseError
381390
     from dlm.doc.parser import parse_file
382391
     from dlm.hardware import doctor
383392
     from dlm.inference import AdapterNotFoundError, generate, load_for_inference
@@ -488,6 +497,7 @@ def export_cmd(
488497
 
489498
     from dlm.base_models import GatedModelError, download_spec
490499
     from dlm.base_models import resolve as resolve_base_model
500
+    from dlm.doc.errors import DlmParseError
491501
     from dlm.doc.parser import parse_file
492502
     from dlm.export import (
493503
         ExportError,
@@ -736,6 +746,7 @@ def show_cmd(
736746
 
737747
     from rich.console import Console
738748
 
749
+    from dlm.doc.errors import DlmParseError
739750
     from dlm.doc.errors import DlmParseError
740751
     from dlm.doc.parser import parse_file
741752
     from dlm.store.errors import ManifestCorruptError