Azure App Onboard Prereq — 저장소 평가
사용자 저장소의 빌드 건강성, 앱 완전성 및 Azure 배포 가능성을 인프라 계획 전에 평가합니다. 구성 요소별 평결(PASS/WARN/FAIL)을 생성하여 다음 단계에서 사용합니다.
오케스트레이터 관계:
azure-app-onboard의 3단계에서 호출되거나 독립 실행형 코드 준비 확인으로 사용됩니다. 오케스트레이터에 의해 호출된 경우 아티팩트 작성 후 제어를azure-app-onboard로 반환하고 다음 단계를 직접 호출하지 마십시오.
AppOnboard 파이프라인의 1/4단계. 세션: .copilot-azure/sessions/{session-id}/. context.json을 읽습니다. components[], repo{}, detectedInfra[]를 작성합니다. prereq-output.json을 생성합니다. 스키마: prereq-schemas.ts — PrereqOutput, BuildRequirements. 직접 진입이 지원됩니다.
사용하지 말아야 할 경우
| 신호 | 리디렉션 |
|---|---|
| 인프라(Bicep/TF/azure.yaml) 검증 | azure-validate |
| IaC 생성 | azure-prepare |
| 아이디어부터 프로덕션까지 엔드투엔드 | azure-app-onboard |
azd up 또는 배포 실행 | azure-deploy |
규칙
⛔ 절대 금지 —
npm install,npm test,npx jest,pytest및 모든 설치/빌드/테스트 명령은 절대 허용되지 않습니다. 어떤 상황에서도npm install,npm test,npx jest,pip install,pytest,dotnet build,dotnet restore,dotnet test,go mod download,cargo build또는 패키지 관리자 설치, 빌드, 테스트 명령을 prereq 단계에서 실행해서는 안 됩니다. 코드 검증을 위해 테스트 스위트를 실행하지 말고 대신 테스트 구성 파일을 정적으로 확인하십시오. prereq 단계는 읽기 전용 평가 + 정적 전용 검증입니다. 유일한 예외 — 두 가지 허용 컨텍스트, 모두 동의 필요: (a) 에이전트가 마이그레이션/수정 중에 수정한 코드(remediation-protocol.md 6단계 참조) 또는 (b) 에이전트가 제로 코드 경로에서 처음부터 작성한 코드(zero-code-path.md 참조). 두 경우 모두 설치/빌드/테스트는 사용자가 특정 명령별 동의 프롬프트에 응답한 후에만 사용자 확인된 빌드 검증 게이트(build-check.md 3단계)를 통해 실행됩니다. 일반적인 사전 동의는 적용되지 않습니다.
- ⛔ 전체 파이프라인(1~8단계), 예외 없음. 모든 프롬프트 → 직접 1단계로 이동합니다. 특정 질문에 대한 답변은 결과의 일부로(5단계) 제공하며, 그 전에 제공하지 않습니다.
- ⛔ 평가를 위한 하위 에이전트 금지. 3축 평가는 인라인으로 수행됩니다. 예외: 제로 코드 경로 스캐폴딩(2단계).
- 코드/파괴적 수정은
ask_user가 필요합니다. 결과 전 최대 3개의 질문. 직접 진입: 오케스트레이터의 의도 질문을 반복하지 마십시오.
MCP 도구
| 도구 | 목적 |
|---|---|
mcp_azure_mcp_get_azure_bestpractices | 감지된 스택 패턴을 Azure 모범 사례에 대해 검증 |
mcp_azure_mcp_extension_cli_install | 필요한 CLI 도구(az, azd, func) 설치/확인 |
워크플로우
1단계: 세션 확인
오케스트레이터 진입: 세션이 존재함 — context.json을 읽고 2단계로 진행합니다.
직접 진입: .copilot-azure/sessions/active-session.json 확인:
- 존재함 → ⛔ session-protocol.md를 읽어 재개/새로 시작 게이트를 확인합니다. 사용자가 응답할 때까지 진행하지 마십시오.
- 없음 → 세션 생성: UUID 생성,
New-Item -ItemType Directory -Path ".copilot-azure/sessions/{uuid}" -Force,create도구를 통해context.json+active-session.json작성.
그런 다음: az account show → {id, name, tenantId}를 context.json.azure에 병합합니다. ⛔ 스캔 전에 세션이 디스크에 존재해야 합니다.
2단계: 작업 공간 스캔
프로젝트 파일을 스캔합니다. 구성 요소, repo{}, detectedInfra[], detectedServices[]를 감지합니다. Terraform 공급자를 분류합니다. CLI 가용성을 확인합니다. 스택 감지 충돌: 사용자의 명시적 문장이 우선(context.json에 기록, 스캔을 재정의로 표시); 스캔 전용 → 사용자에게 확인; 여러 스택 → 모두 표시하고 질문(component-mapping.md 참조); 코드 없음 → zero-code-path.md.
프로젝트 파일, Dockerfile 및 index.html이 모두 없는 경우 → ⛔ zero-code-path.md를 읽습니다.
⛔ Cloud SDK 조기 게이트.
aws-sdk|@aws-sdk|boto3|google-cloud|@google-cloud|firebase를 grep합니다. 기능적 의존성이 발견되면 → cloud-sdk-migration.md를 읽은 후ask_user: "Azure Cloud Migrate로 리디렉션"(routeToSkill: "azure-cloud-migrate"설정) · "계속 평가"(준비 상태 평가 완료 + SDK→Azure 매핑, 그런 다음 8단계에서 중지 — 의존성이 교체될 때까지 계획 없음) · "취소".
3단계: 구성 요소별 평가
| 하위 단계 | 작업 | 참조 |
|---|---|---|
| 3.1 | 빌드 확인 | ⛔ build-check.md를 반드시 읽으십시오 |
| 3.2 | 완전성 확인 | ⛔ completeness-check.md를 반드시 읽으십시오 |
| 3.3 | 배포 가능성 확인 | ⛔ deployability-check.md를 반드시 읽으십시오 |
| 3.3a | 구성 요소 매핑 (조건부) | 1개 이상의 프로젝트 매니페스트가 발견된 경우(모노레포)에만 component-mapping.md를 읽습니다 |
평가 후 구성 요소별로 buildRequirements를 채웁니다. 평결 전파, 계층 규칙 및 f1Viable 집계는 readiness-gate.md 및 개별 확인 참조에 설명되어 있습니다.
4단계: 아티팩트 작성 + 준비 게이트
⛔ context.json이 디스크에 존재하는지 확인합니다. readiness-gate.md(평결, 계층, 일괄 승인, 빠른 경로)를 읽은 다음 prereq-artifacts.md(작성 절차, 스키마)를 읽습니다.
5단계: 결과 제시
readiness-gate.md § 결과 제시에 따라 — 심각도별로 그룹화된 평결을 진행하기 전에 표시합니다.
6단계: 수정 (조건부)
⛔ ❌ FAIL 평결, 🔧 권장 수정 또는 fixPhase: "prereq"가 있는 ⚠️ WARN이 있는 경우 remediation-protocol.md를 반드시 읽으십시오. 수정 루프, 정적 검증, 재평가 명령, 수정 후 아티팩트 업데이트 및 빌드 검증 동의 게이트가 포함되어 있습니다. 모든 평결이 ✅ PASS이거나 fixPhase: "prereq"가 없는 ⚠️ WARN인 경우 7단계로 건너뜁니다.
7단계: 최종 상태 작성
completedPhases에 이미 "prereq"가 있고 currentPhase: null입니다(4단계에서). 그런 다음:
⛔
lastScanCommit을 작성합니다.git rev-parse HEAD를 실행하고 전체 40자 SHA를context.json.repo.lastScanCommit에 저장합니다. 필수 — 재개 시 1단계의 부실 방지 장치가 HEAD와 비교하여 변경 사항을 감지합니다.
8단계: 라우팅
⛔ 필수 — 이 단계를 건너뛰지 마십시오.
라우팅 필드: 모든 라우팅은
routeToSkill과routeReason을context.json에 기록합니다.
수정 후 컨텍스트: 6단계가 실행된 경우 라우팅 프롬프트를 다음으로 시작하십시오: "수정 완료 — {N}개 문제 해결됨, 앱이 이제 {전체 건강 상태}입니다."