repatch
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.
Install
pip install -e .
# Nexu: repatch @ file:///path/to/repatch in pyproject.toml
Public API (repatch)
| 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 |
Multi-Language Client SDKs
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:
1. JavaScript SDK (sdks/js/repatch-sdk.js)
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.
2. Python Client SDK (sdks/python/repatch_sdk.py)
A thread-safe client that allows other python services, test harnesses, or CLI agents to subscribe or broadcast patches:
from repatch_sdk import RepatchClient
client = RepatchClient("ws://localhost:8083/repatch")
@client.on_patch
def handle_patch(data):
print("Received patch DSL:", data["dsl"])
client.start()
client.send_patch("STYLE #btn-eq { background: red; }")
Example: marked context + UI patch prompt
from repatch import build_marked_element_context
from repatch.ui_patch import build_ui_patch_prompt
ctx = 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)
Example: file-level option previews
from repatch import enforce_deletes_on_option_previews, sync_option_previews_from_workspace
sync_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,
)
Original RepatchService (v0)
from repatch import RepatchService
service = 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.0108 (19 commits)
- 👤 **Human dev:** ~$1057 (10.6h @ $100/h, 30min dedup)
Generated on 2026-07-06 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"],
)
for idx, item in enumerate(suggestions, start=1):
print(f"Wariant {idx}:")
print("KEEP:", item.keep)
print("CHANGE:", item.change)
print(item.patched_fragment)
License
Licensed under Apache-2.0.
Metadata
Release files for repatch 0.2.20
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| repatch-0.2.20.tar.gz | 60.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| repatch-0.2.20-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 114.1 kB
Release files / repatch-0.2.20.tar.gz
| Download URL | repatch-0.2.20.tar.gz |
|---|---|
| Size | 60.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
dcb2a4b2a0561b70e9aaf9d133a13f19a5c00f0e81f35c44689a1f31ce1f0770
|
|
BLAKE2b-256 checksum How to use checksums |
cb977ae65026ca613c05698699cf277cf02489472bde788057daf8926b73cbcd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.7
|
Release files / repatch-0.2.20-py3-none-any.whl
| Download URL | repatch-0.2.20-py3-none-any.whl |
|---|---|
| Size | 53.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6feb37fab59393d0edfacb26abf82a871980debbeca5a25488fd646279d4187c
|
|
BLAKE2b-256 checksum How to use checksums |
d6b3069dbb80c4432ffaa2d4773df46f0d4ca010b0f222070ee892f7d8336609
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.7
|