continue
This commit is contained in:
@@ -38,7 +38,7 @@ coders: [claude-coder]
|
||||
reviewers: [claude-reviewer]
|
||||
# seniors: [codex-senior]
|
||||
|
||||
# 파이프라인 종류: simple | cross-review | plan-review | review-only | review-fix | coding-review-fix
|
||||
# 파이프라인 종류: plan-review | coding-plan-review
|
||||
pipeline: preset:{preset}
|
||||
|
||||
# 반복 설정
|
||||
@@ -194,20 +194,12 @@ def main(argv: list[str] | None = None) -> int:
|
||||
)
|
||||
init_parser.add_argument(
|
||||
"--preset",
|
||||
default="simple",
|
||||
choices=[
|
||||
"simple",
|
||||
"cross-review",
|
||||
"plan-review",
|
||||
"review-only",
|
||||
"review-fix",
|
||||
"coding-review-fix",
|
||||
],
|
||||
default="coding-plan-review",
|
||||
choices=["plan-review", "coding-plan-review"],
|
||||
help=(
|
||||
"파이프라인 종류 (기본: simple). "
|
||||
"simple=코딩+리뷰, cross-review=교차리뷰, plan-review=문서리뷰수정재검증, "
|
||||
"review-only=리뷰만, review-fix=리뷰수렴+자동수정, "
|
||||
"coding-review-fix=초기코딩후리뷰수렴"
|
||||
"파이프라인 종류 (기본: coding-plan-review). "
|
||||
"plan-review=문서리뷰수정재검증, "
|
||||
"coding-plan-review=문서기반구현후 코드+문서 리뷰/수정/재검증"
|
||||
),
|
||||
)
|
||||
init_parser.add_argument(
|
||||
@@ -252,9 +244,9 @@ def main(argv: list[str] | None = None) -> int:
|
||||
)
|
||||
demo_parser.add_argument(
|
||||
"--preset",
|
||||
default="simple",
|
||||
choices=["simple", "review-fix", "coding-review-fix"],
|
||||
help="데모할 파이프라인 종류 (기본: simple)",
|
||||
default="coding-plan-review",
|
||||
choices=["plan-review", "coding-plan-review"],
|
||||
help="데모할 파이프라인 종류 (기본: coding-plan-review)",
|
||||
)
|
||||
demo_parser.add_argument(
|
||||
"--escalate",
|
||||
@@ -281,25 +273,12 @@ def main(argv: list[str] | None = None) -> int:
|
||||
),
|
||||
epilog=(
|
||||
"파이프라인 종류 (--preset):\n"
|
||||
" ┌──────────────┬─────────────────────────────────────────────────────┐\n"
|
||||
" │ simple │ Coder가 코드 작성 → Reviewer가 리뷰 │\n"
|
||||
" │ (기본값) │ FAIL이면 피드백 반영해서 재코딩, PASS까지 반복 │\n"
|
||||
" ├──────────────┼─────────────────────────────────────────────────────┤\n"
|
||||
" │ review-fix │ 2단계 파이프라인: │\n"
|
||||
" │ │ Reviewer N명 병렬 리뷰 → 취합 → 수정 → 재검증 │\n"
|
||||
" ├──────────────┼─────────────────────────────────────────────────────┤\n"
|
||||
" │ coding- │ 3단계 파이프라인: │\n"
|
||||
" │ review-fix │ 초기 코딩 1회 → 리뷰 취합 → 수정 → 재검증 반복 │\n"
|
||||
" ├──────────────┼─────────────────────────────────────────────────────┤\n"
|
||||
" │ plan-review │ 구현 전 기획서/체크리스트/문서를 검토하고 │\n"
|
||||
" │ │ 수정한 뒤 시니어가 재검증할 때까지 반복 │\n"
|
||||
" ├──────────────┼─────────────────────────────────────────────────────┤\n"
|
||||
" │ review-only │ 코드 작성 없이 Reviewer N명이 기존 코드만 검토 │\n"
|
||||
" │ │ (이미 작성된 코드의 품질 감사용) │\n"
|
||||
" ├──────────────┼─────────────────────────────────────────────────────┤\n"
|
||||
" │ cross-review │ Coder 2명이 각각 구현 → 상대방 코드를 교차 리뷰 │\n"
|
||||
" │ │ (서로 다른 에이전트의 구현 비교용) │\n"
|
||||
" └──────────────┴─────────────────────────────────────────────────────┘\n"
|
||||
" ┌─────────────────────┬──────────────────────────────────────────────┐\n"
|
||||
" │ coding-plan-review │ 입력 문서 기반 구현 → 코드+문서 리뷰/수정 │\n"
|
||||
" │ (기본값) │ → 재검증 반복 │\n"
|
||||
" ├─────────────────────┼──────────────────────────────────────────────┤\n"
|
||||
" │ plan-review │ 구현 전 문서 리뷰 → 문서 수정 → 재검증 반복 │\n"
|
||||
" └─────────────────────┴──────────────────────────────────────────────┘\n"
|
||||
"\n"
|
||||
"기본 제공 에이전트:\n"
|
||||
" ┌──────────────────┬─────────┬───────────┬──────────────────────────┐\n"
|
||||
@@ -316,34 +295,13 @@ def main(argv: list[str] | None = None) -> int:
|
||||
"\n"
|
||||
"사용 예시:\n"
|
||||
"\n"
|
||||
" 기본 실행 (Claude가 코딩하고 Claude가 리뷰):\n"
|
||||
" cross-eval run --plan plan.md\n"
|
||||
"\n"
|
||||
" Codex가 코딩, Claude가 리뷰:\n"
|
||||
" cross-eval run --plan plan.md --coder codex --reviewer claude\n"
|
||||
"\n"
|
||||
" 리뷰어 2명 (Claude + Codex):\n"
|
||||
" cross-eval run --plan plan.md --reviewer claude --reviewer codex\n"
|
||||
"\n"
|
||||
" 리뷰 취합용 Senior 추가:\n"
|
||||
" cross-eval run --plan plan.md --preset review-fix \\\n"
|
||||
" --reviewer claude --reviewer codex --senior codex\n"
|
||||
"\n"
|
||||
" 리뷰 수렴 후 자동 수정 (review-fix):\n"
|
||||
" cross-eval run --plan plan.md --preset review-fix \\\n"
|
||||
" --reviewer claude --reviewer codex\n"
|
||||
"\n"
|
||||
" 초기 코딩 후 리뷰 수렴 + 자동 수정 (coding-review-fix):\n"
|
||||
" cross-eval run --plan plan.md --preset coding-review-fix \\\n"
|
||||
" --reviewer claude --reviewer codex\n"
|
||||
"\n"
|
||||
" 기존 코드 리뷰만 (review-only):\n"
|
||||
" cross-eval run --plan plan.md --preset review-only \\\n"
|
||||
" --reviewer claude --reviewer codex\n"
|
||||
" 코드 + 문서 구현/리뷰 루프 (coding-plan-review):\n"
|
||||
" cross-eval run --plan plan.md --preset coding-plan-review \\\n"
|
||||
" --coder claude --reviewer codex --reviewer claude --senior codex\n"
|
||||
"\n"
|
||||
" 문서 리뷰 + 수정 + 재검증 반복 (plan-review):\n"
|
||||
" cross-eval run --plan plan.md --preset plan-review \\\n"
|
||||
" --coder codex --reviewer codex\n"
|
||||
" --coder claude --reviewer codex --reviewer claude --senior codex\n"
|
||||
"\n"
|
||||
" 모델 변경:\n"
|
||||
" cross-eval run --plan plan.md --model sonnet\n"
|
||||
@@ -420,7 +378,11 @@ def main(argv: list[str] | None = None) -> int:
|
||||
)
|
||||
agent_group.add_argument(
|
||||
"--agentic", action="store_true", default=False,
|
||||
help="Coder를 agentic 모드로 실행 (worktree에서 파일 직접 수정, git diff로 결과 캡처)",
|
||||
help="Coder를 agentic 모드로 실행 (파일 직접 수정, git diff로 결과 캡처)",
|
||||
)
|
||||
agent_group.add_argument(
|
||||
"--worktree", action="store_true", default=False,
|
||||
help="기본 direct mode 대신 isolated git worktree에서 실행",
|
||||
)
|
||||
agent_group.add_argument(
|
||||
"--model", default=None, metavar="MODEL",
|
||||
@@ -443,15 +405,8 @@ def main(argv: list[str] | None = None) -> int:
|
||||
pipe_group = run_parser.add_argument_group("파이프라인")
|
||||
pipe_group.add_argument(
|
||||
"--preset", default=None,
|
||||
choices=[
|
||||
"simple",
|
||||
"cross-review",
|
||||
"plan-review",
|
||||
"review-only",
|
||||
"review-fix",
|
||||
"coding-review-fix",
|
||||
],
|
||||
help="파이프라인 종류 (기본: simple). 각 종류 설명은 아래 참조",
|
||||
choices=["plan-review", "coding-plan-review"],
|
||||
help="파이프라인 종류 (기본: coding-plan-review). 각 종류 설명은 아래 참조",
|
||||
)
|
||||
pipe_group.add_argument(
|
||||
"--max-iter", type=int, default=None,
|
||||
@@ -560,18 +515,11 @@ def cmd_demo(args: argparse.Namespace) -> int:
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
_PRESET_DESCRIPTIONS = {
|
||||
"simple": "코딩 + 리뷰 (가장 기본)",
|
||||
"review-fix": "리뷰 → 취합 → 수정 → 재검증 반복",
|
||||
"coding-review-fix": "초기 코딩 + 리뷰 수렴 반복",
|
||||
"coding-plan-review": "입력 문서 기반 구현 후 코드+문서 리뷰/수정 반복",
|
||||
"plan-review": "문서 리뷰 → 수정 → 재검증 반복",
|
||||
"review-only": "기존 코드만 리뷰 (코딩 없음)",
|
||||
"cross-review": "2명이 각각 구현 후 교차 리뷰",
|
||||
}
|
||||
|
||||
_PRESET_ORDER = [
|
||||
"simple", "review-fix", "coding-review-fix",
|
||||
"plan-review", "review-only", "cross-review",
|
||||
]
|
||||
_PRESET_ORDER = ["coding-plan-review", "plan-review"]
|
||||
|
||||
|
||||
def _prompt_choice(
|
||||
@@ -640,7 +588,7 @@ def _run_guided_init(target: Path) -> dict:
|
||||
coder = _prompt_text(" Coder 에이전트", default="claude")
|
||||
reviewer = _prompt_text(" Reviewer 에이전트", default="claude")
|
||||
|
||||
needs_senior = preset in ("review-fix", "coding-review-fix")
|
||||
needs_senior = preset in ("coding-plan-review", "plan-review")
|
||||
senior = ""
|
||||
if needs_senior:
|
||||
senior = _prompt_text(" Senior 에이전트", default=reviewer)
|
||||
@@ -899,10 +847,10 @@ def cmd_run(args: argparse.Namespace) -> int:
|
||||
need_rebuild = args.preset is not None or args.coders or args.reviewers or args.seniors
|
||||
if need_rebuild:
|
||||
from cross_eval.prompts import PHASED_PRESETS
|
||||
preset = args.preset or "simple"
|
||||
preset = args.preset or "coding-plan-review"
|
||||
# Determine which preset was configured (from YAML or defaults)
|
||||
if args.preset is None and config.phases:
|
||||
preset = config.preset_name if config.preset_name != "custom" else "review-fix"
|
||||
preset = config.preset_name if config.preset_name != "custom" else "coding-plan-review"
|
||||
elif args.preset is None and not args.coders and not args.reviewers and not args.seniors:
|
||||
pass # no changes needed
|
||||
inferred_coders, inferred_reviewers, inferred_seniors = _infer_roles(
|
||||
@@ -929,8 +877,6 @@ def cmd_run(args: argparse.Namespace) -> int:
|
||||
elif preset in PIPELINE_PRESETS:
|
||||
config.pipeline = PIPELINE_PRESETS[preset](coders, reviewers, seniors)
|
||||
config.phases = []
|
||||
if preset == "review-only" and args.max_iter is None and args.min_iter is None:
|
||||
config.max_iterations = 1
|
||||
|
||||
sync_phased_iterations(config)
|
||||
if args.max_iter is not None:
|
||||
@@ -951,6 +897,9 @@ def cmd_run(args: argparse.Namespace) -> int:
|
||||
if coder_name in config.agents:
|
||||
_make_agentic(config.agents[coder_name])
|
||||
|
||||
if args.worktree:
|
||||
config.use_worktree = True
|
||||
|
||||
ensure_fix_preset_agentic(config)
|
||||
|
||||
# --model: apply to ALL agents
|
||||
@@ -988,7 +937,7 @@ def cmd_run(args: argparse.Namespace) -> int:
|
||||
print(f"No files found in: {docs_dir}", file=sys.stderr)
|
||||
return 1
|
||||
config.inputs["docs"] = docs_content
|
||||
config.inputs["docs_ref"] = str(docs_dir)
|
||||
config.inputs["docs_ref"] = docs_dir
|
||||
|
||||
if args.env_files:
|
||||
for env_file in args.env_files:
|
||||
@@ -1062,6 +1011,9 @@ def cmd_run(args: argparse.Namespace) -> int:
|
||||
if not args.dry_run and result.run_dir:
|
||||
print(f"Output: {result.run_dir}/")
|
||||
|
||||
if args.dry_run:
|
||||
return 0
|
||||
|
||||
if result.final_verdict == "ESCALATE":
|
||||
from cross_eval.report import print_escalation_report
|
||||
print_escalation_report(config, result)
|
||||
|
||||
Reference in New Issue
Block a user