- INTENT.md: three-layer model (blueprint/instance/harness), single shared runtime, never-become boundaries - ADR-001 (accepted): DEC-2026-002 resolution — one harness repo for all projects; instances are declarative state in consuming repos - docs/architecture.md: components, contracts (manifest, tool profiles, completion events, credential lanes), deployment shape - agent_harness/: executor-worker prototype adopted and renamed (6/6 tests green); HARNESS-WP-0001 initial workplan (7 tasks) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
76 lines
2.4 KiB
Python
76 lines
2.4 KiB
Python
"""CLI: execute exactly one task spec."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
import json
|
|
import sys
|
|
|
|
from agent_harness.runner import run_task
|
|
from agent_harness.taskspec import TaskSpec, TaskSpecError
|
|
|
|
|
|
def main(argv: list[str] | None = None) -> int:
|
|
parser = argparse.ArgumentParser(prog="executor-worker")
|
|
sub = parser.add_subparsers(dest="command", required=True)
|
|
run = sub.add_parser("run", help="Execute one task from a JSON spec file")
|
|
run.add_argument("--task-file", required=True)
|
|
run.add_argument("--no-hub", action="store_true", help="Skip hub reporting")
|
|
scan = sub.add_parser(
|
|
"mail-scan", help="Deterministic company-mailbox scan (no LLM session)"
|
|
)
|
|
scan.add_argument("--target-repo", required=True)
|
|
scan.add_argument("--config", default="integrations/mailbox-binky-company.yml")
|
|
scan.add_argument("--out", default="mailmeta/reports")
|
|
scan.add_argument("--no-hub", action="store_true", help="Skip hub reporting")
|
|
args = parser.parse_args(argv)
|
|
|
|
if args.command == "mail-scan":
|
|
from pathlib import Path
|
|
|
|
from agent_harness.mailscan import run_mail_scan
|
|
|
|
result = run_mail_scan(
|
|
target_repo=Path(args.target_repo).expanduser(),
|
|
config=args.config,
|
|
out_dir=args.out,
|
|
report_to_hub=not args.no_hub,
|
|
)
|
|
print(
|
|
json.dumps(
|
|
{
|
|
"ok": result.ok,
|
|
"report": result.report_path,
|
|
"new_messages": result.new_messages,
|
|
"auth_lane": result.auth_lane,
|
|
"reason": result.reason,
|
|
},
|
|
indent=2,
|
|
)
|
|
)
|
|
return 0 if result.ok else 1
|
|
|
|
try:
|
|
spec = TaskSpec.from_file(args.task_file)
|
|
except (TaskSpecError, OSError, json.JSONDecodeError) as exc:
|
|
print(f"invalid task spec: {exc}", file=sys.stderr)
|
|
return 2
|
|
|
|
result = run_task(spec, report_to_hub=not args.no_hub)
|
|
print(
|
|
json.dumps(
|
|
{
|
|
"ok": result.ok,
|
|
"committed": result.committed,
|
|
"head_after": result.head_after,
|
|
"persona_source": result.persona_source,
|
|
"reason": result.reason,
|
|
},
|
|
indent=2,
|
|
)
|
|
)
|
|
return 0 if result.ok else 1
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|