mit einem Klick
AI Agent 개발 및 배포 (STEP 5)
npx skills add https://github.com/unicorn-plugins/abra --skill developKopieren Sie diesen Befehl und fügen Sie ihn in Claude Code ein, um den Skill zu installieren
AI Agent 개발 및 배포 (STEP 5)
npx skills add https://github.com/unicorn-plugins/abra --skill developKopieren Sie diesen Befehl und fügen Sie ihn in Claude Code ein, um den Skill zu installieren
개발계획서 작성 (STEP 4)
Dify DSL 자동생성 (STEP 2)
Dify 프로토타이핑 자동화 (STEP 3)
요구사항 시나리오 생성 및 선택 (STEP 1)
Dify 환경 구축 및 Abra 플러그인 초기 설정
Abra 플러그인 사용 안내
| name | develop |
| description | AI Agent 개발 및 배포 (STEP 5) |
| user-invocable | true |
| type | orchestrator |
[DEVELOP 스킬 활성화 — STEP 5: AI Agent 개발]
개발계획서에 따라 AI Agent를 코드 기반으로 구현하고 배포 가능한 상태로 만듦.
DSL 구조를 참조하여 LangChain/LangGraph 등으로 코드 구현하며,
빌드 성공, 테스트 통과, 산출물 보고까지 전체 개발 프로세스를 완료함.
/abra:develop 명령 호출 시AGENTS.md 파일에서 ## 환경변수 섹션의 환경변수 로딩.
로딩 실패 시 사용자에게 /abra:setup을 먼저 수행하라고 안내하고 종료.
AI_RUNTIME 자동 감지 및 업데이트:
{ABRA_PLUGIN_DIR}/resources/guides/call-subagent.md의 "0. AI_RUNTIME 자동 감지" 규칙에 따라 현재 런타임을 감지하고 AGENTS.md의 AI_RUNTIME 값을 업데이트.
| 용어 | 정의 |
|---|---|
{PROJECT_DIR} | AGENTS.md 환경변수 섹션의 PROJECT_DIR 값 |
{output_dir} | {PROJECT_DIR}/output (고정) |
{ABRA_PLUGIN_DIR} | AGENTS.md 환경변수 섹션의 ABRA_PLUGIN_DIR 값 |
| 문서 | 경로 | 용도 |
|---|---|---|
| 개발 프롬프트 템플릿 | {ABRA_PLUGIN_DIR}/agents/agent-developer/references/develop.md | 백엔드 구현 위임 시 참조 |
| 프론트엔드 프롬프트 템플릿 | {ABRA_PLUGIN_DIR}/agents/frontend-developer/references/frontend.md | 프론트엔드 구현 위임 시 참조 |
| 에이전트 | FQN |
|---|---|
| agent-developer | abra:agent-developer:agent-developer |
| frontend-developer | abra:frontend-developer:frontend-developer |
{ABRA_PLUGIN_DIR}/resources/guides/combine-prompt.md에 따라 AGENT.md + agentcard.yaml + tools.yaml 합치기Agent(subagent_type=FQN, model=tier_mapping 결과, prompt=조립된 프롬프트) 호출{ABRA_PLUGIN_DIR}/gateway/runtime-mapping.yaml 참조워크플로우 단계에 Agent: {agent-name}이 명시된 경우,
메인 에이전트는 해당 단계를 직접 수행하지 않고, {ABRA_PLUGIN_DIR}/resources/guides/call-subagent.md에 따라 서브 에이젼트 호출
{PROJECT_DIR}/AGENTS.md에 각 Phase 완료 시 저장. 최종 완료 시 Done으로 표기.
## 워크플로우 진행상황
- {skill-name}: Phase3
진행상황 정보가 있는 경우 마지막 완료 단계 이후부터 자동 재개.
개발에 필요한 핵심 입력 존재 여부와 내용 유효성 확인.
{output_dir}/dev-plan.md{output_dir}/scenario.md{output_dir} 아래 최신 검증 버전 DSL 파일 (*_v{MAX}.dsl.yaml)미존재 시 조치
dev-plan.md 없음 → /abra:dev-plan 스킬로 위임/abra:dsl-generate 스킬로 위임dev-plan.md에 ## 1. 개요 ~ ## 9. 배포 계획 9개 섹션이 존재 (dev-plan 스킬 H1 재검증)app.mode, workflow.graph.nodes)§4.1 매핑 테이블 행 수 == DSL type ∈ {llm, code, question-classifier} 노드 수 (dev-plan H3 재검증)§4.0 트리의 루트가 app/임 (src/ 루트 금지)실패 시 조치
/abra:dev-plan 또는 /abra:dsl-generate 재실행 권고 후 종료AGENTS.md의 Lessons Learned 섹션을 로드app 기준 사용src 하위에 생성하지 않음{output_dir}/evidence/ 하위에 저장develop 스킬이 개발계획서만 읽고 테스트용 챗봇 필요 여부를 먼저 판정한 뒤,
반드시 사용자에게 확인받음.
{output_dir}/dev-plan.md만 사용| # | 카테고리 | 확인 항목 |
|---|---|---|
| 1 | 인터페이스 | 입출력이 대화형 HTTP/SSE/WebSocket/Streaming인가 |
| 2 | 검증 방식 | 테스트 전략에 사람 UI 기반 검증이 필요한가 |
| 3 | 시연 용도 | 시연·데모·프레젠테이션 대상으로 기재되었는가 |
| 4 | 운영 사용자 | 운영자 수동 테스트 화면이 요구되는가 |
| 5 | MCP 여부 | MCP 서버만으로 검증 가능한가 (Yes이면 챗봇 불필요) |
판정 룰 (오버라이드 우선 적용):
run_context.chatbot = forcerun_context.chatbot = skip{output_dir}/evidence/ 증거 파일 + 개발결과 레포트({output_dir}/develop-report.md){ABRA_PLUGIN_DIR}/agents/agent-developer/references/develop.md 프롬프트 템플릿 활용run_context)만 전달 (재시도 한도 포함)agent-developer가 수행develop 스킬이 상세 구현 계약을 임의 작성하지 않음src 디렉토리 하위에 결과 파일 생성 금지{output_dir}/dev-plan.md{output_dir}/scenario.md{output_dir}/<latest>.dsl.yaml{PROJECT_DIR}/{output_dir}/evidence/gateway/.venvrun_context:
dev_plan_path: "{output_dir}/dev-plan.md"
scenario_path: "{output_dir}/scenario.md"
dsl_path: "{output_dir}/<latest>.dsl.yaml"
source_root: "app"
options:
chatbot: force|skip
retry_budget:
diagnostics: 5
build: 3
test: 3
total: 10
lessons_learned: <AGENTS.md 매칭 교훈 배열>
agent-developer 결과를 검토하고 재실행 여부 판단.
구현 / 스텁 / 제외 판정 결과 보고 여부{output_dir}/evidence/ 4개 파일 생성 여부TODO(sprint-2) 마커 존재 여부agent-developer가 재시도 예산을 소진하고 중단했을 때:
skip/fix_later는 마커 처리 후 통과, real_bug만 추가 예산으로 재호출blocker: true → /abra:dsl-generate 또는 /abra:dev-plan 재실행 사용자 확인blocker: false → 스텁 처리된 항목을 보고에 표시하고 Phase 4 진행agent-developer 재호출diagnostics=5, build=3, test=3, total=10) 모두 재발급코드 기반 백엔드 구현이 통과한 뒤(Phase 3 완료), 사용자 인터페이스가 필요한 경우 프론트엔드 SPA를 생성하고 백엔드와 통합함. GitHub 배포(Phase 4) 전에 수행하여 push 시 프론트·백엔드·통합 패치가 함께 배포되도록 함.
판정 입력: {output_dir}/dev-plan.md의 §3 사용자 인터페이스 + §9 배포 계획만 사용
판정 룰:
| 조건 | 판정 |
|---|---|
| dev-plan에 "웹 UI", "모바일 웹", "관리자 화면", "사용자 화면" 등 명시 | 권장 |
MCP 서버 단독, API only, 백엔드 only, Streaming HTTP MCP만 명시 | 미권장 |
| §3 부재 또는 인터페이스 명세 모호 | 미권장 (사용자 확인 필요) |
실행 규칙:
run_context_frontend.skip = true → Phase 4로 직진AskUserQuestion 도구로 다음 중 선택:
Vue 3 + Vite (권장 — 검증 완료 스택)React + ViteSkip (이번 턴에는 프론트 미생성)선택 결과를 run_context_frontend.tech_stack에 저장.
Skip 선택 시 run_context_frontend.skip = true → Phase 4로 직진.
AskUserQuestion 도구로 이미지 자동 생성 필요 여부 문의:
예 선택 시:
https://aistudio.google.com/apikey{ABRA_PLUGIN_DIR}/gateway/tools/.env 파일의 GEMINI_API_KEY=... 행에 저장 (없으면 생성)아니오 선택 시: image_generation.enabled = false 로 진행
frontend/ 디렉토리, 백엔드 패치 3종(CORS/StaticFiles+SPA 라우트/멀티스테이지 Dockerfile), 빌드 성공, GET / 200 + HTML 검증, {output_dir}/develop-frontend-report.md + {output_dir}/evidence/frontend/ 4개 증거 파일{ABRA_PLUGIN_DIR}/agents/frontend-developer/references/frontend.md 프롬프트 템플릿 활용run_context_frontend)만 전달 (재시도 한도 + Lessons Learned 5종 강제 주입)develop 스킬이 상세 구현 계약을 임의 작성하지 않음app.mount("/", StaticFiles(html=True)) 패턴 사용 금지 — /assets 마운트 + GET / 명시 라우트만 허용uvicorn 사용 금지 — 검증은 uv run uvicorn으로 수행{output_dir}/dev-plan.md{output_dir}/scenario.md{output_dir}/<latest>.dsl.yaml{PROJECT_DIR}/app/main.py{PROJECT_DIR}/app/api/routes.py{ABRA_PLUGIN_DIR}/agents/frontend-developer/references/{tech_stack}-template/{output_dir}/evidence/frontend/run_context_frontend:
dev_plan_path: "{output_dir}/dev-plan.md"
scenario_path: "{output_dir}/scenario.md"
dsl_path: "{output_dir}/<latest>.dsl.yaml"
backend_source_root: "app"
frontend_source_root: "frontend"
tech_stack: vue3-vite | react-vite
image_generation:
enabled: true | false
api_key_env: "GEMINI_API_KEY"
tool_path: "{ABRA_PLUGIN_DIR}/gateway/tools/generate_image.py"
api_key_env: "VITE_API_KEY"
retry_budget:
diagnostics: 3
build: 3
test: 2
total: 8
lessons_learned:
- "[HIGH] 시스템 uvicorn(0.34) vs uv run uvicorn(0.46) 버전 차이로 정적 파일 silent 404 → 반드시 `uv run uvicorn` — 출처: develop/Phase3.5"
- "[HIGH] FastAPI에서 `app.mount('/', StaticFiles(html=True))` 동작 불안정 → `/assets` 마운트 + `GET /` 라우트로 `FileResponse(static/index.html)` 명시 — 출처: develop/Phase3.5"
- "[MED] `os.path.dirname(__file__)` 상대경로 문제 → `Path(__file__).resolve().parent.parent` 사용 — 출처: develop/Phase3.5"
- "[MED] Windows에서 포트 점유 프로세스는 PowerShell `Stop-Process -Id <pid> -Force` 필요 — 출처: develop/Phase3.5"
- "[MED] Git Bash `curl`의 `/` 경로 변환 문제 → `urllib.request.urlopen` 사용 — 출처: develop/Phase3.5"
frontend-developer 결과를 검토하고 다음을 확인:
frontend/ 디렉토리에 source(src/, vite.config.js|ts, package.json) 생성 여부app/main.py — CORSMiddleware + /assets 마운트 + GET / SPA 라우트deploy/Dockerfile — node:20-slim 빌드 스테이지 + COPY --fromfrontend/.env (VITE_API_KEY = 백엔드 API_KEY)npm install + npm run build 성공 여부 + static/ 정적 산출물 생성urllib.request로 GET / 200 + HTML, GET /health 200 확인){output_dir}/evidence/frontend/ 4종 증거 파일 (build.log, npm-audit.json, verify-output.txt, commands.md){output_dir}/develop-frontend-report.md 12개 항목 작성 여부한도 도달 시 조치 (Phase 3과 동일 패턴):
Handoff 수신 시 조치:
target: agent-developer + blocker: true → Phase 2(백엔드) 재호출 사용자 확인target: plan-writer + blocker: true → /abra:dev-plan 재실행 사용자 확인blocker: false → 임시 처리된 항목을 보고에 표시하고 Phase 4 진행AskUserQuestion 도구로 사용자에게 GitHub Repository 생성·배포 진행 여부를 확인함.
배포를 원하지 않으면 Phase 4 전체를 스킵하고 Phase 5(최종 보고)로 직진함.
배포를 원하면 Step 1 진행.
사용자에게 GitHub 인증 정보를 수집함.
AskUserQuestion 도구로 다음 정보를 순차적으로 문의:
GitHub 계정 보유 여부
https://github.com/signup)GitHub Username 입력 요청
Private Repository 사용 여부 입력 요청
Personal Access Token (PAT) 입력 요청
https://github.com/settings/tokens/new?scopes=repo)repo (전체)Organization 사용 여부
https://github.com/account/organizations/new)토큰 저장
{PROJECT_DIR}/.temp/secrets/ 디렉토리 생성{PROJECT_DIR}/.temp/secrets/git-token.env 파일에 저장:
GITHUB_USERNAME={username}
GITHUB_TOKEN={token}
GITHUB_OWNER={owner}
{PROJECT_DIR}/.gitignore에 .temp/ 패턴이 포함되어 있는지 확인, 없으면 추가{ABRA_PLUGIN_DIR}/gateway/tools/create_repo.py 도구를 사용하여 GitHub 저장소 생성 + 로컬 Git 초기화 + Push를 한번에 수행함.
gh CLI 설치가 불요하며, Python 표준 라이브러리만 사용.
분기 결정: 현재 프로젝트가 이미 git 저장소이고 git remote -v에 origin이 설정되어 있으면 5단계(업데이트 배포)만 수행함. 그 외 신규 저장소는 1~4단계(신규 생성)를 수행함.
{output_dir}/dev-plan.md의 '프로젝트명, 목적' 참조하여 작성.gitignore 존재 확인create_repo.py 실행:
python {ABRA_PLUGIN_DIR}/gateway/tools/create_repo.py \
--name {repo-name} \
--desc "{description}" \
--private {true/false} \
--token {PAT} \
--dir {PROJECT_DIR}
--org {org} 옵션 추가git add .
git commit -m "{변경사항}"
git push
create_repo.py가 수행하는 작업: 저장소 존재 여부 확인 → 원격 저장소 생성 →git init→git remote add origin→ 초기 커밋 →git push -u origin main
git remote -v
ghp_, github_pat_, gho_, ghu_ 등):
https://[^@]+@github\.com/git remote set-url origin https://github.com/{owner}/{repo}.git
⚠️ 원격 URL에서 토큰이 발견되어 제거함. 해당 토큰을 즉시 폐기 권장. GitHub → Settings → Developer settings → Personal access tokens → 해당 토큰 삭제
✅ 원격 URL에 토큰 노출 없음 한 줄 보고로 검증 완료 표시Git Push 완료 후 Git Repository 등록 메시지 표시
Phase 0~4 결과를 종합 보고.
개발 결과 레포트 경로
어플리케이션 수행 방법
사용자 검증 방법 최종 보고에 3단계 검증 수단을 명시.
| 단계 | 수단 | 자동화 | 책임 |
|---|---|---|---|
| 1차 | MCP Client E2E (tests/e2e/) | 자동 | agent-developer |
| 2차 | 테스트 챗봇 (선택) | 반자동 | agent-developer (Phase 1 force일 때) |
| 3차 | 수동 Playwright | 사용자 | develop 스킬 (프론트엔드 개발 시에만. 아래 안내 메시지) |
Playwright 테스트 안내 메시지: E2E 자동 실행 대신, 최종 보고 시 아래 예제를 프로젝트에 맞게 수정하여 안내 메시지로 제공.
# Playwright MCP를 이용하여 AI 직접 테스트 요청
※ 주의: Playwright MCP는 스크린샷 이미지를 캡처해서 수행하므로 토큰 소비 많음
※ 낮은 모델 사용 권장, 사용자가 일부 준비 동작 직접 수행
- 아래 프롬프트로 요청
> Playwright MCP로 {프론트엔드 URL}에 접근해 주세요.
> {로그인이 필요하면} id: {본인id}, pw: {본인pw}로 로그인해 주세요.
- 사용자가 테스트할 대상 화면을 직접 열거나 필요한 사전 동작 수행
- 에러 발생 또는 개선 필요 시 수정 요청
> {에러 또는 개선 내용}
{output_dir}/develop-report.md 생성{output_dir}/evidence/ 4개 증거 파일 생성frontend/ 디렉토리 + 백엔드 통합 패치 3종 + static/ 정적 산출물 생성 + {output_dir}/develop-frontend-report.md + {output_dir}/evidence/frontend/ 4개 파일 생성uv run uvicorn 백엔드 기동 후 urllib.request로 GET / 200(HTML) + GET /health 200 검증 완료develop: Done으로 최종 갱신함.| # | 규칙 |
|---|---|
| 1 | 개발계획서의 기술스택 및 아키텍처를 준수함 |
| 2 | Phase 0.2 입력 유효성 게이트(G0.1~G0.4)를 모두 통과한 뒤 Phase 1 진행함 |
| 3 | 빌드 성공 및 테스트 통과를 실제로 확인함 |
| 4 | README.md를 작성함 |
| 5 | {ABRA_PLUGIN_DIR}/agents/agent-developer/references/develop.md 템플릿을 활용함 |
| 6 | 소스 코드는 app 루트를 기준으로 생성함 |
| 7 | 챗봇 생성 여부는 개발계획서만 읽고 먼저 판단한 뒤 반드시 사용자 확인을 거침 |
| 8 | 재시도 한도(retry_budget)를 agent-developer에 전달하고 한도 도달 시 사용자 확인을 거침 |
| 9 | GitHub 배포 전에는 반드시 사용자 확인과 필수 질문 수집을 수행함 |
| 10 | 수동 Playwright 테스트 안내 메시지는 develop 스킬이 Phase 5에서 직접 생성함 |
| 11 | Phase 3.5에서 프론트엔드 필요 여부는 dev-plan §3·§9만 보고 판정한 뒤 반드시 사용자 확인을 거침 |
| 12 | Phase 3.5에서 기술스택 선택 + 이미지 생성 옵션 + GEMINI_API_KEY 수집을 사용자에게 순차 문의함 |
| 13 | 백엔드 통합 패치(CORSMiddleware, StaticFiles, FileResponse SPA 라우트, 멀티스테이지 Dockerfile)는 frontend-developer가 직접 적용함 |
| 14 | 검증 시 uv run uvicorn을 사용함 (시스템 uvicorn 사용 금지) |
| 15 | HTTP 검증은 urllib.request로 수행함 (Git Bash curl 경로변환 회피) |
| # | 금지 사항 |
|---|---|
| 1 | 개발계획서 범위 외 기능을 구현하지 않음 |
| 2 | DSL 원본 파일을 수정하지 않음 |
| 3 | src 디렉토리 하위에 결과 파일을 생성하지 않음 |
| 4 | E2E Playwright 테스트를 자동 필수 단계로 수행하지 않음 |
| 5 | 사용자 확인 없이 GitHub 원격 저장소에 배포하지 않음 |
| 6 | 재시도 한도 없이 무한 루프로 진단/빌드/테스트를 반복하지 않음 |
| 7 | Playwright 안내 메시지 생성을 agent-developer에 위임하지 않음 |
| 8 | 프론트엔드 필수 여부 자동 판정(사용자 확인 없이 자동 진행) 금지 |
| 9 | app.mount("/", StaticFiles(html=True)) 패턴 사용 금지 — /assets 마운트 + GET / 명시 라우트만 허용 |
| 10 | os.path.dirname(__file__) 상대경로 사용 금지 — Path(__file__).resolve() 사용 |
| 11 | 백엔드 통합 패치를 develop 스킬·agent-developer에 위임 금지 (frontend-developer 책임) |
app 기준 소스 구조 사용 및 src 하위 미생성 확인TODO(sprint-2) 마커가 존재하는가app/main.py CORS+/assets+GET /, 멀티스테이지 Dockerfile, .gitignore 보강)이 모두 적용되었는가uv run uvicorn + urllib.request 검증으로 GET / 200(HTML) 응답을 확인했는가