anchors.py
python
sha256:4671b7f787ddbe63ced31c895b688c77ab495653b65a730b423329f26b3c1439
feat: K1-P1 complete — agent provenance, build-verification…
Sonnet 4.6
patch
54 days ago
| 1 | """Named anchor markers for templated section replacement (§4).""" |
| 2 | |
| 3 | from __future__ import annotations |
| 4 | |
| 5 | import re |
| 6 | |
| 7 | ANCHOR_OPEN = "<!-- overseer:anchor:{name} -->" |
| 8 | ANCHOR_CLOSE = "<!-- /overseer:anchor:{name} -->" |
| 9 | |
| 10 | |
| 11 | def anchor_open(name: str) -> str: |
| 12 | return ANCHOR_OPEN.format(name=name) |
| 13 | |
| 14 | |
| 15 | def anchor_close(name: str) -> str: |
| 16 | return ANCHOR_CLOSE.format(name=name) |
| 17 | |
| 18 | |
| 19 | HANDOVER_ANCHORS = frozenset( |
| 20 | { |
| 21 | "vcs-table", |
| 22 | "done-recently", |
| 23 | "verified-snapshot", |
| 24 | "change-log", |
| 25 | "next-session", |
| 26 | "paste-ready-prompt", |
| 27 | } |
| 28 | ) |
| 29 | |
| 30 | ROADMAP_ANCHORS = frozenset( |
| 31 | { |
| 32 | "build-queue", |
| 33 | "next-step-glance", |
| 34 | } |
| 35 | ) |
| 36 | |
| 37 | |
| 38 | def replace_anchor_block(text: str, name: str, new_body: str) -> str: |
| 39 | """Replace content between named anchors; insert anchors if the block is missing.""" |
| 40 | open_marker = anchor_open(name) |
| 41 | close_marker = anchor_close(name) |
| 42 | body = new_body.strip("\n") |
| 43 | block = f"{open_marker}\n{body}\n{close_marker}" |
| 44 | |
| 45 | pattern = re.compile( |
| 46 | re.escape(open_marker) + r"\n.*?\n" + re.escape(close_marker), |
| 47 | re.DOTALL, |
| 48 | ) |
| 49 | if pattern.search(text): |
| 50 | return pattern.sub(block, text, count=1) |
| 51 | |
| 52 | return _insert_anchor_fallback(text, name, block) |
| 53 | |
| 54 | |
| 55 | def _insert_anchor_fallback(text: str, name: str, block: str) -> str: |
| 56 | """Insert anchor block near a known heading when markers are absent.""" |
| 57 | heading_map = { |
| 58 | "vcs-table": "## VCS (verified", |
| 59 | "done-recently": "### What just landed", |
| 60 | "verified-snapshot": "## Verified snapshot", |
| 61 | "change-log": "## Change log", |
| 62 | "next-session": "## NEXT SESSION", |
| 63 | "paste-ready-prompt": "### Paste-ready prompt", |
| 64 | "build-queue": "## Build queue", |
| 65 | "next-step-glance": "## Next step at a glance", |
| 66 | } |
| 67 | heading = heading_map.get(name) |
| 68 | if heading and heading in text: |
| 69 | return text.replace(heading, block + "\n\n" + heading, 1) |
| 70 | return text.rstrip() + "\n\n" + block + "\n" |
File History
1 commit
sha256:4671b7f787ddbe63ced31c895b688c77ab495653b65a730b423329f26b3c1439
feat: K1-P1 complete — agent provenance, build-verification…
Sonnet 4.6
patch
54 days ago