Blueprint v2.4-2.6: Style Rules UI, Lore RAG, Thread Tracking, Redo Book
v2.4 — Item 7: Refresh Style Guidelines - web/routes/admin.py: Added /admin/refresh-style-guidelines route (AJAX-aware) - templates/system_status.html: Added 'Refresh Style Rules' button with spinner v2.5 — Item 8: Lore & Location RAG-Lite - story/bible_tracker.py: Added update_lore_index() — extracts location/item descriptions from chapters into tracking_lore.json - story/writer.py: Reads chapter locations/key_items, builds LORE_CONTEXT block injected into the prompt (graceful degradation if no tags) - cli/engine.py: Loads tracking_lore.json on resume, calls update_lore_index after each chapter, saves tracking_lore.json v2.5 — Item 9: Structured Story State (Thread Tracking) - story/state.py (new): load_story_state, update_story_state (extracts active_threads, immediate_handoff, resolved_threads via model_logic), format_for_prompt (structured context replacing the prev_sum blob) - cli/engine.py: Loads story_state.json on resume, uses format_for_prompt as summary_ctx for write_chapter, updates state after each chapter accepted v2.6 — Item 10: Redo Book - templates/consistency_report.html: Added 'Redo Book' form with instruction input and confirmation dialog - web/routes/run.py: Added revise_book route — creates new Run, queues generate_book_task with user instruction as feedback Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -189,6 +189,22 @@ def write_chapter(chap, bp, folder, prev_sum, tracking=None, prev_content=None,
|
||||
if items:
|
||||
char_visuals += f" * Held Items: {', '.join(items)}\n"
|
||||
|
||||
# Build lore block: pull only locations/items relevant to this chapter
|
||||
lore_block = ""
|
||||
if tracking and tracking.get('lore'):
|
||||
chapter_locations = chap.get('locations', [])
|
||||
chapter_items = chap.get('key_items', [])
|
||||
lore = tracking['lore']
|
||||
relevant_lore = {
|
||||
name: desc for name, desc in lore.items()
|
||||
if any(name.lower() in ref.lower() or ref.lower() in name.lower()
|
||||
for ref in chapter_locations + chapter_items)
|
||||
}
|
||||
if relevant_lore:
|
||||
lore_block = "\nLORE_CONTEXT (Canonical descriptions for this chapter — use these exactly):\n"
|
||||
for name, desc in relevant_lore.items():
|
||||
lore_block += f"- {name}: {desc}\n"
|
||||
|
||||
style_block = "\n".join([f"- {k.replace('_', ' ').title()}: {v}" for k, v in style.items() if isinstance(v, (str, int, float))])
|
||||
if 'tropes' in style and isinstance(style['tropes'], list):
|
||||
style_block += f"\n- Tropes: {', '.join(style['tropes'])}"
|
||||
@@ -282,6 +298,7 @@ def write_chapter(chap, bp, folder, prev_sum, tracking=None, prev_content=None,
|
||||
{prev_context_block}
|
||||
- CHARACTERS: {json.dumps(chars_for_writer)}
|
||||
{char_visuals}
|
||||
{lore_block}
|
||||
- SCENE_BEATS: {json.dumps(chap['beats'])}
|
||||
{treatment_block}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user