将角色与 Skill 从 .claude 迁入 .agent,移除 Claude CLI 运行时并接入固定 Opus 角色 profile、完整 schema、预算 deadline、raw 与回执证据链。 同步拆分 Skill 职责、复利 lesson、Gate 回放、Dashboard 人审入口、数据库登记和机械门禁;候选设计正文不包含在本提交中。
85 lines
2.9 KiB
Python
85 lines
2.9 KiB
Python
#!/usr/bin/env python3
|
||
"""批次1效果信号:人审流转助手(只动 example_lesson 状态机)。
|
||
|
||
用法:
|
||
list [--work-id N] [--status proposed|reviewing|promoted|rejected]
|
||
review <lesson_id> --by <who> [--rationale ...]
|
||
promote <lesson_id> --by <who> --target-type pattern|skill|tool --target-ref <ref> [--rationale ...]
|
||
reject <lesson_id> --by <who> [--rationale ...]
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import argparse
|
||
import json
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
SCRIPT = Path(__file__).resolve().parent
|
||
EVIDENCE = SCRIPT.parent / ".agent" / "skills" / "record-run-evidence" / "scripts"
|
||
if str(EVIDENCE) not in sys.path:
|
||
sys.path.insert(0, str(EVIDENCE))
|
||
|
||
from lesson_registry import ( # noqa: E402
|
||
list_lessons,
|
||
promote,
|
||
reject,
|
||
start_review,
|
||
)
|
||
|
||
|
||
def _print(payload) -> None:
|
||
print(json.dumps(payload, ensure_ascii=False, indent=2, default=str))
|
||
|
||
|
||
def main(argv: list[str] | None = None) -> int:
|
||
parser = argparse.ArgumentParser(description=__doc__)
|
||
sub = parser.add_subparsers(dest="cmd", required=True)
|
||
|
||
p_list = sub.add_parser("list", help="列出经验登记")
|
||
p_list.add_argument("--work-id", type=int)
|
||
p_list.add_argument("--status")
|
||
p_list.add_argument("--kind")
|
||
|
||
p_review = sub.add_parser("review", help="proposed → reviewing")
|
||
p_review.add_argument("lesson_id", type=int)
|
||
p_review.add_argument("--by", required=True, dest="decided_by")
|
||
p_review.add_argument("--rationale", default=None)
|
||
|
||
p_promote = sub.add_parser("promote", help="reviewing → promoted")
|
||
p_promote.add_argument("lesson_id", type=int)
|
||
p_promote.add_argument("--by", required=True, dest="decided_by")
|
||
p_promote.add_argument("--target-type", required=True, choices=["pattern", "skill", "tool"])
|
||
p_promote.add_argument("--target-ref", required=True)
|
||
p_promote.add_argument("--rationale", default=None)
|
||
|
||
p_reject = sub.add_parser("reject", help="proposed/reviewing → rejected")
|
||
p_reject.add_argument("lesson_id", type=int)
|
||
p_reject.add_argument("--by", required=True, dest="decided_by")
|
||
p_reject.add_argument("--rationale", default=None)
|
||
|
||
args = parser.parse_args(argv)
|
||
if args.cmd == "list":
|
||
_print(list_lessons(work_id=args.work_id, status=args.status, kind=args.kind))
|
||
return 0
|
||
if args.cmd == "review":
|
||
_print(start_review(args.lesson_id, decided_by=args.decided_by, rationale=args.rationale))
|
||
return 0
|
||
if args.cmd == "promote":
|
||
_print(promote(
|
||
args.lesson_id,
|
||
decided_by=args.decided_by,
|
||
target_type=args.target_type,
|
||
target_ref=args.target_ref,
|
||
rationale=args.rationale,
|
||
))
|
||
return 0
|
||
if args.cmd == "reject":
|
||
_print(reject(args.lesson_id, decided_by=args.decided_by, rationale=args.rationale))
|
||
return 0
|
||
return 2
|
||
|
||
|
||
if __name__ == "__main__":
|
||
raise SystemExit(main())
|