Switch to cases/{new,in-progress,completed}/ directory structure

Replace single CASES_DIR with find_case_dir() that searches across
all status directories. New cases created in cases/new/{number}/.

Config: CASES_BASE, CASES_NEW, CASES_IN_PROGRESS, CASES_COMPLETED
Docker: added -v /home/chaim/legal-ai/cases:/cases volume mount

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-04 10:45:47 +00:00
parent dc6026100c
commit 5fc52ce530
6 changed files with 32 additions and 12 deletions

View File

@@ -52,9 +52,29 @@ ANTHROPIC_API_KEY = os.environ.get("ANTHROPIC_API_KEY", "")
# Data directory
DATA_DIR = Path(os.environ.get("DATA_DIR", str(Path.home() / "legal-ai" / "data")))
CASES_DIR = DATA_DIR / "cases"
TRAINING_DIR = DATA_DIR / "training"
# Cases directory — new structure: cases/{new,in-progress,completed}/{case_number}/
CASES_BASE = Path(os.environ.get("CASES_BASE", str(Path.home() / "legal-ai" / "cases")))
CASES_NEW = CASES_BASE / "new"
CASES_IN_PROGRESS = CASES_BASE / "in-progress"
CASES_COMPLETED = CASES_BASE / "completed"
CASES_DIR = CASES_NEW # backwards compatibility — new cases default here
_STATUS_DIRS = [CASES_NEW, CASES_IN_PROGRESS, CASES_COMPLETED]
def find_case_dir(case_number: str) -> Path:
"""Find a case directory across all status folders.
Returns the existing directory, or defaults to CASES_NEW/{case_number}.
"""
for base in _STATUS_DIRS:
candidate = base / case_number
if candidate.exists():
return candidate
return CASES_NEW / case_number
# Chunking parameters
CHUNK_SIZE_TOKENS = 600
CHUNK_OVERLAP_TOKENS = 100

View File

@@ -171,7 +171,7 @@ async def export_decision(case_id: UUID, output_path: str | None = None) -> str:
# Determine output path
if not output_path:
case_dir = config.CASES_DIR / case["case_number"] / "output"
case_dir = config.find_case_dir(case["case_number"]) / "output"
case_dir.mkdir(parents=True, exist_ok=True)
output_path = str(case_dir / f"החלטה-{case['case_number']}.docx")

View File

@@ -60,7 +60,7 @@ async def case_create(
)
# Initialize git repo for the case
case_dir = config.CASES_DIR / case_number
case_dir = config.find_case_dir(case_number)
case_dir.mkdir(parents=True, exist_ok=True)
(case_dir / "documents").mkdir(exist_ok=True)
(case_dir / "drafts").mkdir(exist_ok=True)
@@ -167,7 +167,7 @@ async def case_update(
updated = await db.update_case(UUID(case["id"]), **fields)
# Git commit the update
case_dir = config.CASES_DIR / case_number
case_dir = config.find_case_dir(case_number)
if case_dir.exists():
case_json = case_dir / "case.json"
case_json.write_text(json.dumps(updated, default=str, ensure_ascii=False, indent=2))

View File

@@ -39,7 +39,7 @@ async def document_upload(
title = source.stem
# Copy file to case directory
case_dir = config.CASES_DIR / case_number / "documents"
case_dir = config.find_case_dir(case_number) / "documents"
case_dir.mkdir(parents=True, exist_ok=True)
dest = case_dir / source.name
shutil.copy2(str(source), str(dest))
@@ -68,7 +68,7 @@ async def document_upload(
doc["doc_type"] = classified_type
# Git commit
repo_dir = config.CASES_DIR / case_number
repo_dir = config.find_case_dir(case_number)
if repo_dir.exists():
subprocess.run(["git", "add", "."], cwd=repo_dir, capture_output=True)
doc_type_hebrew = {

View File

@@ -44,7 +44,7 @@ async def workflow_status(case_number: str) -> str:
from pathlib import Path
from legal_mcp import config
case_dir = config.CASES_DIR / case_number
case_dir = config.find_case_dir(case_number)
draft_path = case_dir / "drafts" / "decision.md"
has_draft = draft_path.exists()
draft_size = draft_path.stat().st_size if has_draft else 0