Add storage layer with FileStorage, MarkdownReader, and MarkdownWriter classes. Add data models (Project, Session, Note, Change).
66 lines
2.0 KiB
Python
66 lines
2.0 KiB
Python
"""Note service for note management."""
|
|
|
|
from datetime import datetime
|
|
|
|
from ..models import Session, NoteType, Note
|
|
|
|
|
|
def add_note(session: Session, note_type: str, text: str) -> dict:
|
|
"""
|
|
Add a note to the session and return the note dict.
|
|
Valid note types: work, change, blocker, decision, idea, reference
|
|
"""
|
|
try:
|
|
note_type_enum = NoteType(note_type)
|
|
except ValueError:
|
|
raise ValueError(f"Invalid note type: {note_type}. Valid types are: {[t.value for t in NoteType]}")
|
|
|
|
note = Note(type=note_type_enum, text=text)
|
|
session.raw_notes.append(note.model_dump(mode="json"))
|
|
|
|
return {
|
|
"type": note.type.value,
|
|
"text": note.text,
|
|
"created_at": note.created_at.isoformat(),
|
|
}
|
|
|
|
|
|
def consolidate_notes(raw_notes: list[dict]) -> dict:
|
|
"""
|
|
Consolidate raw notes into categorized sections.
|
|
Returns dict with keys: work_done, changes, decisions, blockers, references
|
|
"""
|
|
result = {
|
|
"work_done": [],
|
|
"changes": [],
|
|
"decisions": [],
|
|
"blockers": [],
|
|
"references": [],
|
|
}
|
|
|
|
for note in raw_notes:
|
|
if isinstance(note, dict):
|
|
note_type = note.get("type", "")
|
|
text = note.get("text", "")
|
|
else:
|
|
# Handle string format like "[type] text"
|
|
parts = note.split("]", 1)
|
|
if len(parts) == 2:
|
|
note_type = parts[0][1:]
|
|
text = parts[1].strip()
|
|
else:
|
|
continue
|
|
|
|
if note_type == NoteType.WORK.value:
|
|
result["work_done"].append(text)
|
|
elif note_type == NoteType.CHANGE.value:
|
|
result["changes"].append(text)
|
|
elif note_type == NoteType.DECISION.value:
|
|
result["decisions"].append(text)
|
|
elif note_type == NoteType.BLOCKER.value:
|
|
result["blockers"].append(text)
|
|
elif note_type == NoteType.REFERENCE.value:
|
|
result["references"].append(text)
|
|
|
|
return result
|