Reusable HTML/CSS/DOM patch utilities extracted from Nexu Cinema: marked-element context, scope-restricted CSS, spatial deletes, LLM UI patch prompts, and local function DOM patches.
Also includes the original RepatchService for scope-based LLM fragment suggestions.
pip install -e .# Nexu: repatch @ file:///path/to/repatch in pyproject.toml| Module | Key symbols |
|---|---|
marked_context | build_marked_element_context, resolve_marked_llm_context, restrict_scope_css_to_marks, marked_css_selectors, has_ui_marks |
scope | inject_scope_style, strip_scope_style, normalize_focus_scope, should_block_full_html_iterate, scoped_html_fragment |
ui_patch | build_ui_patch_prompt, parse_ui_patch_response, apply_ui_patch_options, supports_llm_patch_scope |
spatial | apply_spatial_deletes_to_html |
dom_patch | build_function_option_patches, build_function_patch_context, supports_function_patch |
options | sync_option_previews_from_workspace, enforce_deletes_on_option_previews, replace_html_title, html_files_distinct |
css | split_css_rules, validate_css_safety |
project_ir | build_project_ir, summarize_project_ir |
service | RepatchService, PatchSuggestion |
The repatch repository provides official client-side and process SDKs under the sdks/ directory to simplify surgical real-time UI mutations across different languages and platforms:
A client-side library to be included in browsers. It connects to the Repatch WebSocket/SSE stream and executes surgical updates:
ADD <selector> <html_content>: Appends child element.REPLACE <selector> <html_content>: Replaces content.STYLE <selector> { css }: Scopes CSS to element.REMOVE <selector>: Deletes element.
A thread-safe client that allows other python services, test harnesses, or CLI agents to subscribe or broadcast patches:
fromrepatch_sdkimportRepatchClientclient=RepatchClient("ws://localhost:8083/repatch")
@client.on_patchdefhandle_patch(data):
print("Received patch DSL:", data["dsl"])
client.start()
client.send_patch("STYLE #btn-eq { background: red; }")fromrepatchimportbuild_marked_element_contextfromrepatch.ui_patchimportbuild_ui_patch_promptctx=build_marked_element_context(html, keep_ids=["7"], delete_ids=["tan"], focus_scope="colors", project_kind="calculator")
prompt=build_ui_patch_prompt(html, focus_scope="colors", project_kind="calculator", option_variants=variants, context_fragment=ctx)fromrepatchimportenforce_deletes_on_option_previews, sync_option_previews_from_workspacesync_option_previews_from_workspace(
"capsule/cinema",
stage=0,
delete_ids=["old-cta"],
finalize_html=my_finalize_html,
)
enforce_deletes_on_option_previews(
"capsule/cinema",
["old-cta"],
finalize_html=my_finalize_html,
)fromrepatchimportRepatchServiceservice=RepatchService(model="gpt-4o-mini")
fragment="""<section> <h1>Pracownia Malort Gdynia – przestrzeń dla kreatywności Twojego dziecka</h1> <p>Zapraszamy do wyjątkowego miejsca...</p>## AI Cost Tracking     - 🤖 **LLM usage:** $2.9005 (25 commits)- 👤 **Human dev:** ~$1683 (16.8h @ $100/h, 30min dedup)Generated on 2026-07-07 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/qwen/qwen3-coder-next)--- <button>Zapisz dziecko</button></section>"""suggestions=service.generate_patch_suggestions(
fragment=fragment,
scopes=["display", "colors"],
)
foridx, iteminenumerate(suggestions, start=1):
print(f"Wariant {idx}:")
print("KEEP:", item.keep)
print("CHANGE:", item.change)
print(item.patched_fragment)Licensed under Apache-2.0.