with one click
code-reviewer-aim
// Use when reviewing someone else's AIM merge request or when triggered by requesting-code-review-aim for self-review. Requires MR number and topic name.
// Use when reviewing someone else's AIM merge request or when triggered by requesting-code-review-aim for self-review. Requires MR number and topic name.
[HINT] Download the complete skill directory including SKILL.md and all related files
| name | code-reviewer-aim |
| description | Use when reviewing someone else's AIM merge request or when triggered by requesting-code-review-aim for self-review. Requires MR number and topic name. |
IMS/Jira/GitLab ์ ๋ณด ์์ง๋ถํฐ ์ฝ๋/ํ ์คํธ/์ปค๋ฒ๋ฆฌ์ง ๋ฆฌ๋ทฐ, ์ข ํฉ ๋ณด๊ณ ์, GitLab MR ์ฝ๋ฉํธ ๋ฑ๋ก๊น์ง ์์ด์ ํธ ํ์ด ์๋ ์ํํ๋ค.
๋ณธ ์คํฌ์ ๋ชจ๋ ๊ฒฝ๋ก์์ ../agent/๋ aim ํ๋ก์ ํธ ๋ฃจํธ ๊ธฐ์ค ์๋ ๊ฒฝ๋ก์ด๋ค.
/Users/mjkang/company/dev_sshfs/aim/../agent/ โ /Users/mjkang/company/dev_sshfs/agent/../agent/prompt/<topic>/02_code_review.md โ /Users/mjkang/company/dev_sshfs/agent/prompt/<topic>/02_code_review.mdํ์ผ Read/Write ์ ๋ฐ๋์ aim ๋ฃจํธ๋ฅผ working directory๋ก ์ฌ์ฉํ๋ค.
base role name๊ณผ prompt ํ์ผ ๋งคํ. ์ค์ spawn ์ ์ด๋ฆ์ aim-<role>-<topic> (์๋ "๋ค์ด๋ฐ ๊ท์น" ์ฐธ์กฐ).
| base role | prompt ํ์ผ | ์ญํ | Phase |
|---|---|---|---|
aim-info-collector | ./info-collector-prompt.md | IMS/Jira/GitLab/git ์ ๋ณด ์์ง | B |
aim-code-reviewer | ./code-reviewer-prompt.md | C ์ฝ๋ ๋ฆฌ๋ทฐ (์คํ์ผ+๋ณด์+์ฑ๋ฅ+์ํคํ ์ฒ ํตํฉ) | D |
aim-test-reviewer | ./test-reviewer-prompt.md | GoogleTest ๋ฆฌ๋ทฐ | D |
aim-coverage-analyst | ./coverage-analyst-prompt.md | gcov ์ปค๋ฒ๋ฆฌ์ง ์ธก์ | D |
aim-review-synthesizer | ./review-synthesizer-prompt.md | ์ข ํฉ/๋ฌธ์ํ/GitLab ์ฝ๋ฉํธ ์ด์ | E |
์์ด์ ํธ ์คํฐ ์ ํด๋น prompt ํ์ผ์ Readํ์ฌ ๋ด์ฉ์ Agent ๋๊ตฌ์ prompt์ ํฌํจํ๊ณ , ํ์ ๋งคํ ๋ธ๋ก(์๋)์ ํจ๊ป appendํ๋ค.
์ฌ์ฉ์ ์ ๋ ฅ์์ ์๋ ์ ๋ณด๋ฅผ ์ถ์ถํ๋ค:
acsapi_aix_351005_6293OFV7-6293!577351005)source_branch์์ ์๋ ์ถ์ถ--auto (์ ํ): ์ค๊ฐ ํ์ธ ์์ด ์์ ์๋ ์คํtopic์์ IMS ๋ฒํธ๋ฅผ ์๋ ์ถ์ถ: <keyword>_<IMS๋ฒํธ>_<Jira๋ฒํธ> ํจํด์์ ๋ ๋ฒ์งธ ์ซ์ ๊ทธ๋ฃน.
์ ํ์ํ๊ฐ: ์ฌ๋ฌ ์ธ์
์์ ๋์์ ์ฝ๋ ๋ฆฌ๋ทฐ ์คํฌ์ ์ํํ๋ฉด ๋์ผ team_name์ ๊ณต์ ํด ~/.claude/teams/<team>/inboxes/<member>.json ๋๋ ํ ๋ฆฌ/inbox๊ฐ ์ถฉ๋ํ๋ค. cross-session SendMessage ๋ผ์ฐํ
ยท์ปจํ
์คํธ ์ค์ผ์ด ๋ฐ์ํ ์ ์๋ค. ๋ฐ๋์ topic ์ ๋ฏธ์ฌ๋ก ๊ฒฉ๋ฆฌํ๋ค.
topic-slug ๋ณํ (ํ์):
<topic-slug> = topic์ ๋ชจ๋ _๋ฅผ -๋ก ์นํํ ๊ฐdisplay_prc_outer_join_353568_6396 โ slug display-prc-outer-join-353568-6396team_name์ underscore๋ฅผ ์ฒ๋ฆฌํ ๋, ~/.claude/teams/<team>/(config dir)๋ _โ- ์ ๊ทํํ์ง๋ง ~/.claude/teams/<team>/inboxes/(๋ฉ์์ง ๋ผ์ฐํ
์ ์์ฑ)๋ underscore๋ฅผ ๋ณด์กดํ๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ๋์ผ ๋
ผ๋ฆฌ team_name์ด ๋ ๋ฌผ๋ฆฌ ๋๋ ํ ๋ฆฌ(...-test_topic.../config.json๊ณผ ...-test-topic.../inboxes/)๋ก ๋ถ๊ธฐ๋์ด cleanupยทexistence-check๊ฐ ๊นจ์ง๋ค. slug์์ underscore๋ฅผ ์ฌ์ ์ ์ ๊ฑฐํด ๋จ์ผ ๋๋ ํ ๋ฆฌ๋ง ์ฌ์ฉํ๋ค.../agent/prompt/<topic>/)๋ ์ผ๋ฐ ํ์ผ์์คํ
๊ฒฝ๋ก๋ผ underscore ๊ทธ๋๋ก ์ ์ง โ slug ๋ณํ์ Claude teams ์๋ณ์(team_name, ๋ฉค๋ฒ name)์๋ง ์ ์ฉํ๋ค.๊ท์น:
team_name = aim-code-review-<topic-slug>name = aim-<role>-<topic-slug>
info-collector, code-reviewer, test-reviewer, coverage-analyst, review-synthesizertopic = display_prc_outer_join_353568_6396 โ slug display-prc-outer-join-353568-6396):
aim-code-review-display-prc-outer-join-353568-6396aim-code-reviewer-display-prc-outer-join-353568-6396, aim-test-reviewer-display-prc-outer-join-353568-6396, ...spawn ์ ํ์ ๋งคํ ์ฃผ์ (ํ์): ๊ฐ Agent spawn prompt ๋์ ์๋ ๋ธ๋ก์ ํญ์ appendํ๋ค. ์ด๋ prompt ํ์ผ ์์ peer ํธ๋ช (์: "ํ ์คํธ ๋ฆฌ๋ทฐ์ด")์ด ์ค์ SendMessage ํ๊ฒ ์ด๋ฆ์ผ๋ก ํด์๋ ์ ์๊ฒ ํ๋ค.
## ํ์ ๋งคํ (์ค์ผ์คํธ๋ ์ดํฐ ์ฃผ์
)
๋์ ํ: aim-code-review-<topic-slug>
๋์ ์ด๋ฆ: aim-<role>-<topic-slug>
ํ์:
- ์ ๋ณด ์์ง (info-collector): aim-info-collector-<topic-slug>
- ์ฝ๋ ๋ฆฌ๋ทฐ (code-reviewer): aim-code-reviewer-<topic-slug>
- ํ
์คํธ ๋ฆฌ๋ทฐ (test-reviewer): aim-test-reviewer-<topic-slug>
- ์ปค๋ฒ๋ฆฌ์ง ๋ถ์ (coverage-analyst): aim-coverage-analyst-<topic-slug>
- ์ข
ํฉ (review-synthesizer): aim-review-synthesizer-<topic-slug>
๋ค๋ฅธ ํ์์๊ฒ SendMessage ์ ์ suffixed ์ด๋ฆ์ผ๋ก ํธ์ถํ๋ค. prompt ๋ณธ๋ฌธ์ ๋ฑ์ฅํ๋ ์ญํ ๋ช
(์: "ํ
์คํธ ๋ฆฌ๋ทฐ์ด")์ ์ ๋งคํ์ผ๋ก ํด์ํ๋ค.
SendMessage / Agent ์ฌํธ์ถ: Phase FยทGยทH์์ ๊ธฐ์กด ํ์์๊ฒ ๋ค์ ์ง์ํ ๋๋ suffixed ์ด๋ฆ์ผ๋ก ํธ์ถํ๋ค. ๊ฐ์ ์ด๋ฆ์ ํ์์ด ์ด๋ฏธ ์กด์ฌํ๋ฉด Agent ์ฌ์คํฐ ๊ธ์ง(์ค๋ณต ์ธ์คํด์ค ์์ฑ), SendMessage๋ก ์ฌํ์ฉํ๋ค.
์ ๋ ๊ท์น: Phase๋ ๋ฐ๋์ A โ B โ C โ D โ E โ F โ G โ H โ I ์์๋ก ์คํํ๋ค. ์ด๋ค Phase๋ ๊ฑด๋๋ฐ๊ฑฐ๋ ๋ณํฉํ์ง ์๋๋ค. ๊ฐ Phase์ gate ์กฐ๊ฑด์ ์ถฉ์กฑํด์ผ๋ง ๋ค์ Phase๋ก ์งํํ๋ค.
์ต์ ํ์ ์ ๋ ฅ: MR ๋ฒํธ๋ง ์์ผ๋ฉด ๋๋จธ์ง๋ ์๋ ์ถ์ถ ๊ฐ๋ฅ.
์ ๋ ฅ ์ฐ์ ์์:
source_branchsource_branch (branch๋ช
์ topic์ผ๋ก ์ฌ์ฉ)OFV7-XXXX ํจํด ์ถ์ถIMS#XXXXXX ํจํด ์ถ์ถMR ๋ฒํธ์กฐ์ฐจ ์์ผ๋ฉด ์ฌ์ฉ์์๊ฒ "MR ๋ฒํธ๋ฅผ ์๋ ค์ฃผ์ธ์"๋ผ๊ณ ์์ฒญํ๋ค.
์คํ ๋ชจ๋๋ AskUserQuestion์ผ๋ก ์ ํ:
AskUserQuestion(questions: [
{
question: "์คํ ๋ชจ๋๋ฅผ ์ ํํด์ฃผ์ธ์",
header: "๋ชจ๋",
options: [
{ label: "ํ ๋ฆฌ๋ทฐ (Recommended)", description: "์ฝ๋+ํ
์คํธ+์ปค๋ฒ๋ฆฌ์ง ์ ์ฒด ๋ฆฌ๋ทฐ" },
{ label: "์ฝ๋๋ง", description: "์ฝ๋ ๋ฆฌ๋ทฐ๋ง ์ํ" },
{ label: "ํ
์คํธ๋ง", description: "ํ
์คํธ ๋ฆฌ๋ทฐ๋ง ์ํ" },
{ label: "์ปค๋ฒ๋ฆฌ์ง๋ง", description: "์ปค๋ฒ๋ฆฌ์ง ์ธก์ ๋ง ์ํ" }
],
multiSelect: false
}
])
์ํ:
../agent/prompt/<topic>/ ๋๋ ํ ๋ฆฌ ์์ฑ../agent/prompt/<topic>/00_input.md ์ ์ฅ๋ฆฌ๋ทฐ๋ ์ฌ์ฉ์์ main aim ์์ ํ๋ฆ์ ๋ณดํธํ๊ธฐ ์ํด worktree ๊ฒฉ๋ฆฌ๋ฅผ default๋ก ํ๋ค.
ํ๋จ ๋ถ๊ธฐ:
dx git status --short ๋น ์ถ๋ ฅ) โ main ์ฌ์ฉ ํ์ฉ# ์๋ ํ๋จ:
dx bash -c "cd /root/ofsrc/aim && [ \"\$(git branch --show-current)\" = \"<๋์_branch>\" ] && [ -z \"\$(git status --short)\" ] && echo 'main_ok' || echo 'use_worktree'"
worktree ์ฌ์ฉ ์:
review_<MR๋ฒํธ> (work์ฉ <keyword>_<IMS>_<Jira>์ ๊ตฌ๋ถ, ์ถฉ๋ ํํผ)dx bash -c "cd /root/ofsrc/aim && ./script/worktree_add.sh review_<MR๋ฒํธ> review_<topic>_<MR๋ฒํธ> <๋์_branch>"
์ดํ ๋ณธ ์คํฌ์ด ์ฌ์ฉํ๋ ์์ ๊ฒฝ๋ก(WORKSPACE_AIM) ๊ฐ ๊ฒฐ์ ๋๋ค:
/Users/mjkang/company/dev_sshfs/aim//Users/mjkang/company/dev_sshfs/aim_worktrees/review_<MR๋ฒํธ>/aim/์ค์ผ์คํธ๋ ์ดํฐ๋ Phase B~F์ ๋ชจ๋ spawn prompt์ WORKSPACE_AIM ๊ฒฝ๋ก๋ฅผ ๋ช
์ํ๋ค (์: "์์
๊ฒฝ๋ก: <WORKSPACE_AIM>"). ์ปค๋ฒ๋ฆฌ์ง ๋ถ์๊ฐ๋ฅผ ํฌํจํ 5๋ช
๋ชจ๋ ๊ฐ์ WORKSPACE_AIM์์ ๋์ํ๋ค (aim repo MR !597 ๋จธ์ง๋ก ์ํฌํธ๋ฆฌ ์ธก์ ์ด main๊ณผ ๋๋ฑํ๊ฒ ๊ฐ๋ฅ).
์ด์ ๊ท์น(install/์๋ฒ๊ธฐ๋ ๊ธ์ง ๋ฑ)๊ณผ ์ ์ ์ ์ฐจ ์์ธ๋ SSoT ์ฐธ์กฐ:
aim/AGENTS.md "Worktree Operations" ์น์
Phase A gate: 00_input.md ํ์ผ์ด ์กด์ฌํ๊ณ ์ํฌ์คํ์ด์ค๊ฐ ๊ฒฐ์ ๋์ด์ผ Phase B ์งํ.
๋ฐ๋์ Agent ๋๊ตฌ๋ก info-collector๋ฅผ ์คํฐํ๋ค. ์ค์ผ์คํธ๋ ์ดํฐ๊ฐ ์ง์ ์ํํ์ง ์๋๋ค.
Agent(
name: "aim-info-collector-<topic-slug>",
subagent_type: "general-purpose",
team_name: "aim-code-review-<topic-slug>",
prompt: "<info-collector-prompt.md์ ๋ด์ฉ> + <00_input.md์ ๋ด์ฉ> + <ํ์ ๋งคํ ๋ธ๋ก>"
)
<ํ์ ๋งคํ ๋ธ๋ก>์ ์ "๋ค์ด๋ฐ ๊ท์น" ์น์
์ฐธ์กฐ. ๋ชจ๋ spawn์ append ํ์.
์์ด์ ํธ ์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฐ ํ ์ฐ์ถ๋ฌผ์ ํ์ธํ๋ค.
Phase B gate: 01_info_collection.md ํ์ผ์ด ์กด์ฌํ๊ณ , "๋ณ๊ฒฝ ๋ด์ฉ ์ด์" ์น์
์ด ํฌํจ๋์ด์ผ Phase C ์งํ.
๋ฐ๋์ 01_info_collection.md๋ฅผ ์ฝ๊ณ plan ํ์ผ์ ์์ฑํ๋ค. ์ด Phase๋ฅผ ๊ฑด๋๋ฐ์ง ์๋๋ค.
01_info_collection.md ๊ธฐ๋ฐ์ผ๋ก ../agent/prompt/<topic>/<topic>_review.plan.md ์์ฑ
--auto๊ฐ ์๋ ๊ฒฝ์ฐ: AskUserQuestion์ผ๋ก plan ํ์ธ
์ต์
: "์คํ" / "์์ ํ ์คํ" / "์ค๋จ"
Phase C gate: ../agent/prompt/<topic>/<topic>_review.plan.md ํ์ผ์ด ์กด์ฌํ๊ณ , ์ฌ์ฉ์๊ฐ ์น์ธ(๋๋ --auto)ํด์ผ Phase D ์งํ.
๋ฐ๋์ Agent ๋๊ตฌ๋ก 3๊ฐ ๋ฆฌ๋ทฐ์ด๋ฅผ ๋์์ ์คํฐํ๋ค. ์ค์ผ์คํธ๋ ์ดํฐ๊ฐ ์ง์ ๋ฆฌ๋ทฐํ์ง ์๋๋ค.
Agent(name: "aim-code-reviewer-<topic-slug>", subagent_type: "general-purpose", team_name: "aim-code-review-<topic-slug>", ...)
Agent(name: "aim-test-reviewer-<topic-slug>", subagent_type: "general-purpose", team_name: "aim-code-review-<topic-slug>", ...)
Agent(name: "aim-coverage-analyst-<topic-slug>", subagent_type: "general-purpose", team_name: "aim-code-review-<topic-slug>", ...)
๊ฐ ์์ด์ ํธ์ prompt์ 01_info_collection.md์ ๋ด์ฉ, ํด๋น ์์ด์ ํธ prompt ํ์ผ ๋ด์ฉ, ๊ทธ๋ฆฌ๊ณ ํ์ ๋งคํ ๋ธ๋ก(์ "๋ค์ด๋ฐ ๊ท์น" ์ฐธ์กฐ)์ ํฌํจํ๋ค.
์์
๊ฒฝ๋ก ์ฃผ์
(ํ์): ๊ฐ spawn prompt์ Phase A์์ ๊ฒฐ์ ๋ WORKSPACE_AIM ๊ฒฝ๋ก๋ฅผ ๋ช
์ํ๋ค (์: "์์
๊ฒฝ๋ก: <WORKSPACE_AIM>"). coverage-analyst๋ฅผ ํฌํจํ ๋ชจ๋ ์์ด์ ํธ๊ฐ ๊ฐ์ ์ํฌ์คํ์ด์ค์์ ๋์ํ๋ค. (aim repo MR !597์ measure_diff_cov.sh PWD ์ธ์ง + env.sh LD prepend๋ก ์ํฌํธ๋ฆฌ ์ธก์ ์ด main๊ณผ ๋๋ฑ.)
์์ด์ ํธ ๊ฐ ํต์ (ํ์ ์ SendMessage, ํ๊ฒ์ spawn ์ ์ฃผ์
๋ suffixed ์ด๋ฆ):
| ์ญํ | ์ฐ์ถ๋ฌผ |
|---|---|
์ฝ๋ ๋ฆฌ๋ทฐ์ด (aim-code-reviewer-<topic-slug>) | ../agent/prompt/<topic>/02_code_review.md |
ํ
์คํธ ๋ฆฌ๋ทฐ์ด (aim-test-reviewer-<topic-slug>) | ../agent/prompt/<topic>/03_test_review.md |
์ปค๋ฒ๋ฆฌ์ง ๋ถ์๊ฐ (aim-coverage-analyst-<topic-slug>) | ../agent/prompt/<topic>/04_coverage.md |
3๊ฐ ์์ด์ ํธ ๋ชจ๋ ์๋ฃ๋ ๋๊น์ง ๋๊ธฐํ๋ค.
๐ด Critical ๊ฒฉ์ ์ measurement-first cross-check (ํ์)
๋ฆฌ๋ทฐ์ด๊ฐ finding์ ๐ด Critical๋ก ๊ฒฉ์ํ๊ธฐ ์ ์๋ filesystem ์กด์ฌ(ํ์ผ/๋๋ ํ ๋ฆฌ/Makefile/์ฝ๋๊ฐ git์ ์๋ค๋ ์ฌ์ค)๋ก๋ถํฐ build graph ํ์ฑ์ ์ถ๋ก ํ์ง ๋ง๊ณ ์ธก์ ์ผ๋ก ๊ฒ์ฆํ๋ค. ์ถ๋ก ์ฑ๋๊ณผ ์ธก์ ์ฑ๋์ด ๋ ๋ฆฝ์ด์ด์ผ false-positive cycle์ ๊นฐ ์ ์๋ค.
| ์ถ๋ก (file presence) | ์ธก์ (independent channel) |
|---|---|
grep MODULE= ๊ฒฐ๊ณผ ๋ ๋๋ ํ ๋ฆฌ ๊ฐ์ | grep -rn <dir> ์ผ๋ก SRC_DIRS ์ง์
๊ฒฝ๋ก ํ์ธ |
| ๋๋ ํ ๋ฆฌ/์์ค ํ์ผ ์กด์ฌ | ๋น๋ ์ฐ์ถ๋ฌผ (.gcno / .o / bin/) ์กด์ฌ ํ์ธ |
| Makefile ์ ์ ๋จ | build log์์ ์ง์ ํ์ ํ์ธ |
| ํจ์ ์ ์ ์กด์ฌ | ํธ์ถ ๊ฒฝ๋ก (rg/lsp/์คํ ๋ก๊ทธ) ํ์ธ |
| ํ ์คํธ ํ์ผ ์กด์ฌ | report/xml/<suite>.xml ๋๋ report/log/ ๊ฒฐ๊ณผ ํ์ธ |
์ค์ผ์คํธ๋ ์ดํฐ๋ ์ฝ๋/ํ ์คํธ ๋ฆฌ๋ทฐ์ด๊ฐ ๐ด Critical์ ๋ณด๊ณ ํ๋ฉด coverage-analyst์๊ฒ measurement cross-check๋ฅผ ๋ช ์ ์์ฒญํ๋ค. coverage-analyst๊ฐ ์ธก์ ์ผ๋ก ํ์ฑ์ confirmํ๊ธฐ ์ ๊น์ง๋ ์ข ํฉ ๋จ๊ณ์์ Critical์ ์ ์ ์ผ๋ก ํ๊ธฐํ๊ณ ๋จธ์ง ์ฐจ๋จ ์ฌ์ ๋ก ๋จ์ ํ์ง ์๋๋ค.
โ ๏ธ ์ฌ๊ณ ์ฌ๋ก (2026-05-06 MR !602): code-reviewer + test-reviewer๊ฐ file presence(
grep MODULE=aimocs๋ ๊ณณ, jxalocsi ๋๋ ํ ๋ฆฌ ์กด์ฌ)๋ก "swap ๋ฐํ" ์ถ๋ก โ ๐ด Critical ๊ฒฉ์. ๋ ๋ช ์ด ๊ฐ์ file-based ์ฑ๋๋ก verify-each-otherํ์ฌ false-positive ๊ฐํ cycle. coverage-analyst์grep -rn jxalocsi(build graph ์ธก์ ) +.gcno0๊ฐ +report/xml/gtest_aimocs.xml14 PASS ํ์ธ์ผ๋ก stranded code ํ์ โ DORMANT๋ก ์ ์ . ์ธก์ ์ฑ๋ ๋ถ์ฌ ์ Critical ๊ฒฉ์์ false-positive ์ํ.
Phase D gate: 02_code_review.md, 03_test_review.md, 04_coverage.md 3๊ฐ ํ์ผ์ด ๋ชจ๋ ์กด์ฌํด์ผ Phase E ์งํ. (๋ชจ๋์ ๋ฐ๋ผ ํด๋น ํ์ผ๋ง ํ์ธ)
๋ฐ๋์ Agent ๋๊ตฌ๋ก review-synthesizer๋ฅผ ์คํฐํ๋ค. ์ค์ผ์คํธ๋ ์ดํฐ๊ฐ ์ง์ ์ข ํฉํ์ง ์๋๋ค.
์คํฐ ์ ์ ์ค์ผ์คํธ๋ ์ดํฐ๊ฐ ๋ฐ๋์ ์๋ 4๊ฐ ํ์ผ์ Readํ์ฌ ์ ์ฒด ๋ด์ฉ์ ํ๋ณดํ๋ค:
../agent/prompt/<topic>/01_info_collection.md../agent/prompt/<topic>/02_code_review.md../agent/prompt/<topic>/03_test_review.md../agent/prompt/<topic>/04_coverage.md์ฝ์ ๋ด์ฉ์ ์ ๋ถ prompt์ ํฌํจํ์ฌ synthesizer๋ฅผ ์คํฐํ๋ค (ํ์ ๋งคํ ๋ธ๋ก๋ ํจ๊ป append):
Agent(
name: "aim-review-synthesizer-<topic-slug>",
subagent_type: "general-purpose",
team_name: "aim-code-review-<topic-slug>",
prompt: """
<review-synthesizer-prompt.md ๋ด์ฉ>
์๋๋ ๋ฆฌ๋ทฐ ์
๋ ฅ ์ฐ์ถ๋ฌผ์ด๋ค. ์ด ๋ด์ฉ์ ๋น ์ง์์ด ์ข
ํฉํ๋ผ.
=== 01_info_collection.md ===
<01 ํ์ผ ์ ์ฒด ๋ด์ฉ>
=== 02_code_review.md ===
<02 ํ์ผ ์ ์ฒด ๋ด์ฉ โ ๋ฐ๊ฒฌ ์ฌํญ, ์์ ์ ์ ํฌํจ>
=== 03_test_review.md ===
<03 ํ์ผ ์ ์ฒด ๋ด์ฉ>
=== 04_coverage.md ===
<04 ํ์ผ ์ ์ฒด ๋ด์ฉ>
topic: <topic>
์ฐ์ถ๋ฌผ ๊ฒฝ๋ก: ../agent/prompt/<topic>/
"""
)
ํต์ฌ: 02_code_review.md์ ์์ ์ ์(๐ด/๐ก/๐ข ๋ฐ๊ฒฌ ์ฌํญ)์ด 05_review_summary.md์ GitLab ์ฝ๋ฉํธ ์ด์์ ๋น ์ง์์ด ๋ฐ์๋์ด์ผ ํ๋ค.
Phase E gate: 05_review_summary.md ํ์ผ์ด ์กด์ฌํ๊ณ , "์ต์ข
ํ์ "๊ณผ "GitLab ์ฝ๋ฉํธ ์ด์" ์น์
์ด ํฌํจ๋์ด์ผ Phase F ์งํ.
synthesizer ์๋ฃ ํ ์ค์ผ์คํธ๋ ์ดํฐ๊ฐ <topic>_review.plan.md์ Phase A~E ์ฒดํฌ๋ฐ์ค๋ฅผ [x]๋ก ์
๋ฐ์ดํธํ๋ค. (plan ํ์ผ ์ฐ๊ธฐ๋ ์ค์ผ์คํธ๋ ์ดํฐ ์ ์ฉ)
GitLab MR ์ฝ๋ฉํธ์ ํค/๊ตฌ์กฐ/์ฌ๊ฐ๋ ํ์ ๊ท์น์ writing-documents-aim์ gitlab-guide.md "MR ์ฝ๋ฉํธ" ์น์ ์ ์ฐธ์กฐํ๋ค.
05_review_summary.md์ "์ฝ๋ฉํธ ๋๋ฝ ๊ฒ์ฆ" ์น์
์ ํ์ธํ๋ค.
๋๋ฝ์ด ์์ผ๋ฉด synthesizer์๊ฒ SendMessage๋ก ๋ณด์ ์์ฒญํ๋ค.
--auto๊ฐ ์๋ ๊ฒฝ์ฐ:
AskUserQuestion์ผ๋ก ํ์ธ: "๋ฑ๋ก" / "์์ ํ ๋ฑ๋ก" / "์คํต"๋ฑ๋ก ์ ์ ๋ณ๊ฒฝ๋ ๋ชจ๋ .c/.cpp/.h ํ์ผ์ clang-format ์ค์ ์ฌ๋ถ๋ฅผ ๊ฒ์ฆํ๋ค:
dx bash -c "cd /root/ofsrc/aim && for f in <changed files>; do diff <(clang-format \$f) \$f > /dev/null 2>&1 && echo 'OK: '\$f || echo 'DIFF: '\$f; done"
์๋ฐ์ด ์์ผ๋ฉด ์ฝ๋ฉํธ์ ํฌํจํ์ฌ ๋ด๋น์์๊ฒ ์๋ดํ๋ค.
์น์ธ ์ GitLab API๋ก ๋ฑ๋ก (Mac์์ ์ง์ curl, project ID: 211):
๋ผ์ธ๋ณ ์ฝ๋ฉํธ ๋ผ์ธ ๋ฒํธ ์ ์ฝ: GitLab API๋ MR diff ๋ฒ์ ๋ด์ ๋ผ์ธ์๋ง inline comment๋ฅผ ๋ฌ ์ ์๋ค. diff ๋ฒ์ ๋ฐ์ ๋ผ์ธ(์: ๊ธฐ์กด ์ฝ๋์ strcpy)์ ๋ํ ์ฝ๋ฉํธ๋ ์ผ๋ฐ ๋ ธํธ(note)๋ก fallbackํ๊ณ , ๋ณธ๋ฌธ์ ํ์ผ:๋ผ์ธ์ ๋ช ์ํ๋ค.
Phase F gate: GitLab ์ฝ๋ฉํธ ๋ฑ๋ก ์๋ฃ (๋๋ ์ฌ์ฉ์๊ฐ ์คํต ์ ํ) ํ Phase G ์งํ.
Phase F ๋ฑ๋ก ์๋ฃ ํ ์ฌ์ฉ์์๊ฒ monitor ์ง์ ์ฌ๋ถ๋ฅผ ๋ฌป๋๋ค. "์" ์ active monitor + Phase H ์๋ ํธ๋ฆฌ๊ฑฐ๋ฅผ ํ์ฑํํ๋ค. "์๋์ค" ์ ๋จ์ idle ๋๊ธฐ(๊ธฐ์กด ๋์).
AskUserQuestion(questions: [{
question: "์์ฑ์ ์๋ต์ active monitor ํ ๊น์? (60s polling, ๋จธ์ง/์์ /์ฝ๋ฉํธ ์๋ ๊ฐ์ง)",
header: "Phase G monitor",
options: [
{ label: "์ (Recommended)", description: "MR head_sha/notes/state 60s polling, ๋ณํ ์ Phase H ์๋ ์ง์
๋๋ ๋ณด๊ณ " },
{ label: "์๋์ค", description: "๋จ์ idle ๋๊ธฐ. ์ฌ์ฉ์๊ฐ ๋ช
์์ ์ผ๋ก ์์ฒญํ ๋๋ง ์ฒ๋ฆฌ" }
],
multiSelect: false
}])
"์๋์ค" ์ ํ ์: ํ์ idle ์ ์ง + ์ฌ์ฉ์ ๋ช
์ ์์ฒญ ์ฒ๋ฆฌ(SendMessage๋ก ํด๋น ํ์ ํธ์ถ). Step 1~4 skipํ๊ณ Step 5๋ง ์ ์ฉ.
run_in_background, persistent)GitLab MR API๋ฅผ 60์ด ๊ฐ๊ฒฉ pollingํ์ฌ ๋ค์ ๋ณํ ๊ฐ์ง:
head_sha ๋ณํ (์ commit push)user_notes_count ์ฆ๊ฐ (์ ์ฝ๋ฉํธ)state opened โ merged / closedpipeline_status ๋ณํ (์ ๋ณด์ฑ)prev_sha="<HEAD_SHA>"
prev_count=<USER_NOTES_COUNT>
while true; do
resp=$(curl -s --header "PRIVATE-TOKEN: $TOKEN" "$BASE/merge_requests/<IID>" 2>/dev/null || echo '{}')
cur_sha=$(echo "$resp" | python3 -c "import json,sys; print(json.load(sys.stdin).get('sha',''))" 2>/dev/null)
cur_count=$(echo "$resp" | python3 -c "import json,sys; print(json.load(sys.stdin).get('user_notes_count',0))" 2>/dev/null)
state=$(echo "$resp" | python3 -c "import json,sys; print(json.load(sys.stdin).get('state',''))" 2>/dev/null)
[ "$cur_sha" != "$prev_sha" ] && [ -n "$cur_sha" ] && echo "NEW_COMMIT: $prev_sha -> $cur_sha" && prev_sha="$cur_sha"
[ "$cur_count" -gt "$prev_count" ] 2>/dev/null && echo "NEW_NOTE: count $prev_count -> $cur_count" && prev_count="$cur_count"
[ "$state" = "merged" ] && echo "MR_MERGED" && break
[ "$state" = "closed" ] && echo "MR_CLOSED" && break
sleep 60
done
run_in_background: true, timeout: 43200000 (12์๊ฐ) ๋๋ horizon์ ๋ง๊ฒ.
Monitor๊ฐ ์ฃฝ๊ฑฐ๋ ๋ฉ์ท์ ๋ ์์ ๋ง. ์์ฑ์ ์์ ์ ๋ถ~์๊ฐ ๋จ์์ด๋ฏ๋ก ์งง์ polling์ผ๋ก cache ์ ์ง๋ฅผ ์๋ํ๋ ๊ฒ์ ๋น์ฉ ๋นํจ์จ (cache TTL 5๋ถ vs ์์ฑ์ ์๋ต ์๊ฐ ๋จ์).
ScheduleWakeup(
delaySeconds: 3600,
reason: "Phase G monitor liveness ์ ๊ฒ (์์ฑ์ ์๋ต ์๊ฐ ๋จ์ horizon)",
prompt: "Phase G monitor ์ํ ์ ๊ฒ"
)
โ ๏ธ ์ฌ๊ณ ์ฌ๋ก (2026-05-06 MR !602): ScheduleWakeup์
prompt๋ฅผ/loop continue๊ฐ์ ์ฌ๋์ ์ปค๋งจ๋๋ก ๊ฑธ๋ฉด fire ์ ์๋์ผ๋ก dynamic mode๊ฐ ๋ถํ ๋์ด ์๊ธฐ ๊ฐํ ๋ฃจํ๊ฐ ํ์ฑ๋๋ค(์๋์น ์์ ๋น์ฉ ๋์ ยทํต์ ์์ค). fallback heartbeat ์ฉ๋ ScheduleWakeup์prompt๋ ๋ฐ๋์ ํ๋ฌธ ์ฌ์ฉ.
๋งค wakeup ๋์ฐฉ ์: Monitor ์ด์์๋์ง ํ์ธ โ ์ฃฝ์์ผ๋ฉด ์ฌ์์ โ ๋ค์ fallback ScheduleWakeup ์ฌ์์ฝ.
| ์ด๋ฒคํธ (Monitor ์๋ฆผ) | ์ฒ๋ฆฌ |
|---|---|
| ์ commit + ์ ์ฝ๋ฉํธ (์์ชฝ ๋์) | Phase H ์๋ ์ง์ (๋ฐ์ ๊ฒ์ฆ) |
| ์ commit๋ง | ์ฌ์ฉ์ ๋ณด๊ณ + Phase H ์ง์ ์์ฌ ํ์ธ |
| ์ ์ฝ๋ฉํธ๋ง (์์ฑ์ reply ๋ฑ) | ์ฌ์ฉ์ ๋ณด๊ณ + Phase H ์ง์ ๋๋ ์ถ๊ฐ ์๋ต ์์ฌ ํ์ธ |
state=merged | Monitor TaskStop + PushNotification + Phase I ์ง์ ๋๋ ์ฌ์ฉ์ ๋ช ์ ์ข ๋ฃ ๋๊ธฐ |
state=closed | Monitor TaskStop + ์ฌ์ฉ์ ๋ณด๊ณ + ์ข ๋ฃ |
pipeline_status ๋ณํ๋ง (์: failedโsuccess๋ LGTM gate ์๋ ํต๊ณผ) | ์ ๋ณด์ฑ ๋ณด๊ณ ๋ง, Phase H ์ง์ ์ ํจ |
์ฌ์ฉ์๊ฐ ๋ช ์์ ์ผ๋ก ์ข ๋ฃ/์ ๋ฆฌ ์์ฒญํ๋ฉด Monitor TaskStop(์๋ค๋ฉด) + ํ shutdown + worktree ์ ๋ฆฌ:
dx bash -c "cd /root/ofsrc/aim && ./script/worktree_remove.sh review_<MR๋ฒํธ>"
์ ๋ฆฌ ์ ์ฐจ ์์ธ๋ using-feature-branches-aim ์คํฌ ์ฐธ์กฐ.
๋ด๋น์๊ฐ GitLab ์ฝ๋ฉํธ๋ฅผ ํ์ธํ๊ณ ์ฝ๋๋ฅผ ์์ ํ ๋ค, ๋ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฒํ ํ๋ ๋จ๊ณ.
์ง์ ์กฐ๊ฑด (๋ ์ค ํ๋):
๊ธฐ์กด ์์ด์ ํธ๋ฅผ ๊ฒ์ฆ ๋ชจ๋๋ก ์ฌํ์ฉํ๋ค. Phase D์์ ๊ฐ ์์ด์ ํธ๊ฐ ์ถ์ ํ ์ปจํ ์คํธ(๋ณธ์ธ์ด ์ง์ ํ finding, ์ ์ํ ์์ ๋ฐฉํฅ)๋ฅผ ํ์ฉํ์ฌ ๋ณธ์ธ์ ์์ญ์ ์ฌ๊ฒ์ฆํ๋ค.
dx git fetch origin <branch> && dx git log <์ด์ HEAD>..<์ HEAD> --oneline
dx git diff <์ด์ HEAD>..<์ HEAD>
GET /api/v4/projects/211/merge_requests/<iid>/discussionsdx bash -c "cd /root/ofsrc/aim && for f in <changed files>; do diff <(clang-format \$f) \$f > /dev/null 2>&1 && echo 'OK: '\$f || echo 'DIFF: '\$f; done"
Phase D์ ๋์ผํ 3๋ช
์ ํ์์ ๊ฒ์ฆ ๋ชจ๋๋ก ์ฌํ์ฉํ๋ค. ์ด๋ฏธ ํ์ ์กด์ฌํ๋ ํ์์ด๋ฏ๋ก Agent ์ฌ์คํฐ ๊ธ์ง โ ๋ฐ๋์ SendMessage๋ก ํธ์ถ(ํ๊ฒ์ Phase D์์ ์ฌ์ฉํ suffixed ์ด๋ฆ).
๊ฐ ๋ฉ์์ง์ ๋ค์์ ํฌํจํ๋ค:
SendMessage(to: "aim-code-reviewer-<topic-slug>", message: "๊ฒ์ฆ ๋ชจ๋ ... ์ด์ 02 + diff + reply")
SendMessage(to: "aim-test-reviewer-<topic-slug>", message: "๊ฒ์ฆ ๋ชจ๋ ... ์ด์ 03 + diff + reply")
SendMessage(to: "aim-coverage-analyst-<topic-slug>", message: "๊ฒ์ฆ ๋ชจ๋ ... make gtest + ์ฌ์ธก์ ")
๊ฐ ํ์์ ๊ฒ์ฆ ์ฐ์ถ๋ฌผ:
| ์ญํ (suffixed name) | ์ฐ์ถ๋ฌผ | ๋ด์ฉ |
|---|---|---|
์ฝ๋ ๋ฆฌ๋ทฐ์ด (aim-code-reviewer-<topic-slug>) | 02_code_review.md ์
๋ฐ์ดํธ | ๐ด/๐ก ํญ๋ชฉ๋ณ: โ ๋ฐ์ / โ ๏ธ๋ถ๋ถ๋ฐ์ / โ๋ฏธ๋ฐ์ / ๐์ถ๊ฐ๋ฐ๊ฒฌ |
ํ
์คํธ ๋ฆฌ๋ทฐ์ด (aim-test-reviewer-<topic-slug>) | 03_test_review.md ์
๋ฐ์ดํธ | ํ ์คํธ ์์ ๊ฒ์ฆ, Mock ๊ตฌ์กฐ ํ์ธ, ์ถ๊ฐ ๋ฐ๊ฒฌ |
์ปค๋ฒ๋ฆฌ์ง ๋ถ์๊ฐ (aim-coverage-analyst-<topic-slug>) | 04_coverage.md ์
๋ฐ์ดํธ | ์ปค๋ฒ๋ฆฌ์ง ์ฌ์ธก์ ๊ฒฐ๊ณผ, ์ ์ฑ ์ถฉ์กฑ ์ฌ๋ถ |
SendMessage(to: "aim-review-synthesizer-<topic-slug>", ...)๋ก ์ข
ํฉ์ ์ง์ํ๋ค (์ฌ์คํฐ ๊ธ์ง).
3๊ฐ ๊ฒ์ฆ ๊ฒฐ๊ณผ๋ฅผ ์ข
ํฉํ์ฌ 05_review_summary.md๋ฅผ ์
๋ฐ์ดํธํ๋ค.
PUT discussions/<id>?resolved=truePhase H gate: ๋ชจ๋ ๐ด ํญ๋ชฉ ๋ฐ์ ํ์ธ + ์ปค๋ฒ๋ฆฌ์ง ์ ์ฑ ์ถฉ์กฑ (๋๋ ๋ฏธ์ถฉ์กฑ ๊ทผ๊ฑฐ ํฉ์) ํ Phase I ์งํ.
Phase I์ ์ํ ์ ์ฐจ๋ ์ง์ ๊ฒฝ๋ก์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
POST /api/v4/projects/211/merge_requests/<iid>/approve../agent/ git push (์ฐ์ถ๋ฌผ ๋ณด์กด)dx bash -c "cd /root/ofsrc/aim && ./script/worktree_remove.sh review_<MR๋ฒํธ>"
state=merged ์๋ ๊ฐ์ง ํ ์ง์
(์์ฑ์ ์์ฒด ๋จธ์ง)์ด๋ฏธ merged ์ํ์ด๋ฏ๋ก Approve API์ LGTM ์ถ๊ฐ ๋ฑ๋ก์ ๋ฌด์๋ฏธ. ์ ๋ฆฌ ์์ ๋ง ์ํ.
../agent/ git push (์ฐ์ถ๋ฌผ ๋ณด์กด)| ์ฌ์ฉ์ ์์ฒญ ํจํด | ์คํ ๋ชจ๋ | ํฌ์ ์์ด์ ํธ |
|---|---|---|
| "์ฝ๋ ๋ฆฌ๋ทฐํด์ค", "์ ์ฒด ๋ฆฌ๋ทฐ" | ํ ๋ฆฌ๋ทฐ | 5๋ช ์ ์ |
| "์ฝ๋๋ง ๋ด์ค" | ์ฝ๋ ๋ชจ๋ | info + code-reviewer + synthesizer |
| "ํ ์คํธ๋ง ๋ด์ค" | ํ ์คํธ ๋ชจ๋ | info + test-reviewer + synthesizer |
| "์ปค๋ฒ๋ฆฌ์ง๋ง ์ธก์ " | ์ปค๋ฒ๋ฆฌ์ง ๋ชจ๋ | info + coverage-analyst + synthesizer |
๋ชจ๋ ์ฐ์ถ๋ฌผ์ ../agent/prompt/<topic>/ ํ์์ ์ ์ฅํ๋ค.
../agent/prompt/<topic>/
โโโ 00_input.md โ ์ฌ์ฉ์ ์
๋ ฅ ์ ๋ฆฌ
โโโ 01_info_collection.md โ IMS/Jira/GitLab/git ์ ๋ณด
โโโ 02_code_review.md โ ์ฝ๋ ๋ฆฌ๋ทฐ (์คํ์ผ+๋ณด์+์ฑ๋ฅ+์ํคํ
์ฒ)
โโโ 03_test_review.md โ ํ
์คํธ ๋ฆฌ๋ทฐ
โโโ 04_coverage.md โ ์ปค๋ฒ๋ฆฌ์ง ์ธก์
โโโ 05_review_summary.md โ ์ข
ํฉ ๋ณด๊ณ ์
โโโ <topic>_review.plan.md โ ๋ฆฌ๋ทฐ ์คํ ๊ณํ + Phase๋ณ ์ฐ์ถ๋ฌผ
ํ์ผ ๊ฒฝ๋ก ํ๊ธฐ ๊ท์น: plan ํ์ผ์ด๋ ์ฌ์ฉ์์๊ฒ ์ฐ์ถ๋ฌผ ๊ฒฝ๋ก๋ฅผ ์๋ดํ ๋, ๋ฐ๋์ aim ๋ฃจํธ ๊ธฐ์ค ์ ์ฒด ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ค.
../agent/prompt/acsapi_aix_351005_6293/02_code_review.md02_code_review.md, review_workspace/acsapi_aix_351005_6293/02_code_review.mdPhase F ๋ฑ๋ก ์ ๋๋ ํ์ ์คํ๋ผ์ธ ๋ฆฌ๋ทฐ๊ฐ ์งํ๋์ด ๋ด๋น์๊ฐ ์ฝ๋๋ฅผ ์์ ํ ๊ฒฝ์ฐ:
dx git diff <์ด์ HEAD>..<์ HEAD> ๋ก ๋ณ๊ฒฝ ์ฌํญ ํ์
05_review_summary.md: ํด๊ฒฐ๋ ํญ๋ชฉ์ 03_test_review.md: ํ
์คํธ ๊ตฌ์กฐ ๋ณ๊ฒฝ ์ Makefile/fixture ์ํฅ ์
๋ฐ์ดํธ<topic>_review.plan.md: Phase ์ํ ์
๋ฐ์ดํธ../agent/ git push: ์ฐ์ถ๋ฌผ ์
๋ฐ์ดํธ ํ pushCalled by:
Feeds into:
| ์๋ฌ ์ ํ | ์ ๋ต |
|---|---|
| IMS ์ ๊ทผ ๋ถ๊ฐ | Chrome ๋ธ๋ผ์ฐ์ ๋ฏธ์ฐ๊ฒฐ ์ IMS ์คํต, Jira/MR๋ง์ผ๋ก ์งํ |
| Jira/GitLab API ์คํจ | ํ ํฐ/๋คํธ์ํฌ ํ์ธ ์์ฒญ ํ ์ฌ์๋ 1ํ |
| ์์ด์ ํธ ์คํจ | 1ํ ์ฌ์๋ โ ์คํจ ์ ํด๋น ์์ญ ์์ด ์งํ, ์ข ํฉ ๋ณด๊ณ ์์ ๋๋ฝ ๋ช ์ |
| ์ปค๋ฒ๋ฆฌ์ง ์คํฌ๋ฆฝํธ ์คํจ | gcda ์กด์ฌ ์ฌ๋ถ ํ์ธ, make gtest ์ฌ์คํ ์๋ด |
| ๋์ฉ๋ diff | ๋ณ๊ฒฝ ํ์ผ ๋๋ ํต์ฌ ํ์ผ์ ์ง์ค, ๋ฒ์๋ฅผ ๋ณด๊ณ ์์ ๋ช ์ |
dx (dev_exec.sh) ๊ฒฝ์ Docker ์ปจํ
์ด๋WORKSPACE_AIM ๊ฒฝ๋ก (Phase A "์ํฌ์คํ์ด์ค ๊ฒฐ์ "์์ ๊ฒฐ์ โ main ๋๋ worktree)aim/script/measure_diff_cov.shmeasure_diff_cov.sh PWD ์ธ์ง + env.sh LD prepend๊ฐ ์๋ ์ฒ๋ฆฌ). ์ธก์ ์์ญ์ main๊ณผ ๋๋ฑํ๋ค โ aim/AGENTS.md "Worktree Operations" ์ฐธ์กฐ. make/make gtest๋ install ์ ํ๋ฏ๋ก tmdown ์ ํ ๋ถํ์. ๋ณ๋ make install ์์๋ง dx tmdown -y ์ ํ.measure_diff_cov.sh ์ถ๋ ฅ + dx git diff --unified=0 <base>..HEAD๋ก ํ์ธ. gcov๋ฅผ ์ง์ grep/awk๋ก ํ์ฑํ๋ฉด ๋ฉํ๋ฐ์ดํฐ 5์ค๋ง ์ถ๋ ฅ๋๋ ์ฌํ์ฑ ์๋ ํ์์ด ์์ผ๋ฏ๋ก ๊ธ์ง.