anchors.py python
70 lines 1.9 KB
Raw
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