feat(operators): amendment workflow and automated drive watchdog daemon
This commit is contained in:
@@ -1542,6 +1542,39 @@ def act_md_diff(account, filename):
|
||||
out(res.pop("ok", True), **res)
|
||||
|
||||
|
||||
def act_md_amend(filename, content, author="operator", reason=""):
|
||||
"""Amend centralized shared template with safety checks and git commit."""
|
||||
import agent_md
|
||||
audit("md-amend", f"{author}:{filename}")
|
||||
try:
|
||||
res = agent_md.amend_md(filename, content, author=author, reason=reason)
|
||||
out(res.pop("ok", True), **res)
|
||||
except Exception as e:
|
||||
fail("AMEND_FAILED", str(e))
|
||||
|
||||
|
||||
def act_md_append(filename, text, author="operator", section=None):
|
||||
"""Safely append an amendment or lesson to a centralized shared template."""
|
||||
import agent_md
|
||||
audit("md-append", f"{author}:{filename}")
|
||||
try:
|
||||
res = agent_md.append_md(filename, text, author=author, section=section)
|
||||
out(res.pop("ok", True), **res)
|
||||
except Exception as e:
|
||||
fail("APPEND_FAILED", str(e))
|
||||
|
||||
|
||||
def act_md_pull(account, filename):
|
||||
"""Pull canonical shared template into an agent container."""
|
||||
import agent_md
|
||||
audit("md-pull", f"{account}:{filename}")
|
||||
try:
|
||||
res = agent_md.pull_md(account, filename)
|
||||
out(res.pop("ok", True), **res)
|
||||
except Exception as e:
|
||||
fail("PULL_FAILED", str(e))
|
||||
|
||||
|
||||
def act_md_inject_drive(account, force=False):
|
||||
"""Inject high-drive operational templates into an agent container via Hatch."""
|
||||
import agent_md
|
||||
@@ -3127,6 +3160,57 @@ def main(argv):
|
||||
act_md_inject_drive(args[0], force=("--force" in args[1:]))
|
||||
elif sub == "sync-all":
|
||||
act_md_sync_all(force=("--force" in args))
|
||||
elif sub == "amend":
|
||||
if len(args) < 2:
|
||||
fail("BAD_ARGS", "usage: md amend <filename> [--content text | --file path] [--author name] [--reason why]")
|
||||
filename = args[0]
|
||||
content = None
|
||||
author = "operator"
|
||||
reason = ""
|
||||
idx = 1
|
||||
while idx < len(args):
|
||||
if args[idx] == "--file" and idx + 1 < len(args):
|
||||
content = Path(args[idx + 1]).read_text(encoding="utf-8")
|
||||
idx += 2
|
||||
elif args[idx] == "--content" and idx + 1 < len(args):
|
||||
content = args[idx + 1]
|
||||
idx += 2
|
||||
elif args[idx] == "--author" and idx + 1 < len(args):
|
||||
author = args[idx + 1]
|
||||
idx += 2
|
||||
elif args[idx] == "--reason" and idx + 1 < len(args):
|
||||
reason = args[idx + 1]
|
||||
idx += 2
|
||||
elif content is None and not args[idx].startswith("--"):
|
||||
content = args[idx]
|
||||
idx += 1
|
||||
else:
|
||||
idx += 1
|
||||
if content is None:
|
||||
fail("BAD_ARGS", "usage: md amend <filename> <content> [--author name] [--reason why]")
|
||||
act_md_amend(filename, content, author=author, reason=reason)
|
||||
elif sub == "append":
|
||||
if len(args) < 2:
|
||||
fail("BAD_ARGS", "usage: md append <filename> <text> [--author name] [--section header]")
|
||||
filename = args[0]
|
||||
text = args[1]
|
||||
author = "operator"
|
||||
section = None
|
||||
idx = 2
|
||||
while idx < len(args):
|
||||
if args[idx] == "--author" and idx + 1 < len(args):
|
||||
author = args[idx + 1]
|
||||
idx += 2
|
||||
elif args[idx] == "--section" and idx + 1 < len(args):
|
||||
section = args[idx + 1]
|
||||
idx += 2
|
||||
else:
|
||||
idx += 1
|
||||
act_md_append(filename, text, author=author, section=section)
|
||||
elif sub == "pull":
|
||||
if len(args) < 2:
|
||||
fail("BAD_ARGS", "usage: md pull <account> <filename>")
|
||||
act_md_pull(args[0], args[1])
|
||||
else:
|
||||
fail("BAD_NAME", f"unknown md subcommand: {sub}")
|
||||
elif action == "loop-remediate":
|
||||
|
||||
Reference in New Issue
Block a user