이슈 생성
핵심 규칙
대상 리포지토리의 기여 워크플로우를 발견한 후에만 제안 또는 게시하십시오. YAML 이슈 폼은 기본 자동화 경로의 형식 권위자입니다. 검토된 답변을 개인 BODY_FILE에 구체화하고 --body-file로 게시합니다.
안전한 발견
먼저 읽기 전용 검사를 실행합니다:
gh auth status
REPO="$(gh repo view --json nameWithOwner -q .nameWithOwner)"
REPO_URL="$(gh repo view --json url -q .url)"
HOST="${REPO_URL#*://}"
HOST="${HOST%%/*}"
TARGET="$HOST/$REPO"
gh repo view --json nameWithOwner,url,hasDiscussionsEnabled,hasIssuesEnabled,isBlankIssuesEnabled
git ls-files README.md CONTRIBUTING.md CONTRIBUTING.* .github/CONTRIBUTING.md .github/ISSUE_TEMPLATE .github/ISSUE_TEMPLATE/config.yml
gh api --hostname "$HOST" --paginate "repos/$REPO/labels?per_page=100" --jq '.[].name'
README.md, 기여 안내, .github/ISSUE_TEMPLATE/config.yml 연락처 링크, 폼, 라벨, 그리고 열리고 닫힌 이슈를 검사합니다. 질문/지원의 경우, 리포지토리가 지정한 Discussions/연락처 경로를 따르거나, 가능하지 않으면 질문하거나 중단합니다. REPO, HOST, TARGET에 대한 대상 확인을 완료합니다. 인증, 대상 확인, 이슈 가용성, 정책, 폼 선택 또는 필수 메타데이터가 누락되거나 모호한 경우, 변경 전에 오류로 실패합니다. 빈 폴백은 isBlankIssuesEnabled가 명시적으로 true인 경우에만 허용됩니다.
검토된 라벨 중 존재하고 정책이 행위자에게 적용을 허용하는 라벨만으로 LABEL_ARGS를 구성합니다:
LABEL_ARGS=()
LABEL_ARGS+=(--label "$LABEL") # 허용된 발견된 라벨 각각에 대해 반복합니다.
중복 확인 및 폼 결정
-
보고 사항을 한 문장으로 설명하고
QUERY를 도출한 다음, 열리고 닫힌 모든 이슈에 대해 중복 검색 한 번을 완료합니다:gh issue list --repo "$TARGET" --state all --search "$QUERY" --limit 1000에이전트는 사전에 중복 검색을 완료하고 그 결과를 보유해야 합니다. 결과가 포화 상태이거나 완전성이 불확실한 경우 읽기 전용 검색 범위를 좁히거나 중단합니다. 새 이슈를 생성하는 대신 확인된 중복 이슈에 댓글을 답니다. 확인된 중복 이슈에 댓글을 달기 전에, 게시할 때와 동일한 개인정보 스캔/편집을 정확한 댓글 본문에 수행합니다.
-
선언된 목적과 일치하는 리포지토리 제공 폼이 하나만 있는 경우에만 선택합니다. 여러 폼이 일치하고 정책이 이를 구분하지 않는 경우, 중단하고 해당 결정을 요청합니다.
-
YAML 폼의 경우, 스키마를 읽고 선언된 순서대로 컨트롤을 설정합니다.
input,textarea,dropdown,checkboxes만 지원합니다. Markdown 컨트롤은 답변 없는 안내입니다. 인접한 답변을 수집하고 구체화할 때 보이는 지시사항을 준수하지만, 응답 섹션으로 렌더링하지는 않습니다. 잘못된 형식, 지원되지 않는 형식, 누락되거나 모호한 필수 구조 또는 답변의 경우, 변경 전에 오류로 실패합니다. 잘못된 스키마, 누락되거나 모호한 필수 답변은 오류로 실패합니다. 브라우저를 열거나 변경하지 마십시오. 브라우저 전환은 사용자가 브라우저 완료를 명시적으로 요청하거나, 구문적으로 유효한 선택된 폼을 자동화 경로로 안전하게/충실하게 표현할 수 없는 경우에만 가능합니다. 그 외에는 자동화가 안전하지 않은 이유를 보고하고 중단합니다.
| 컨트롤 | 필수 처리 |
|---|---|
input / textarea | 보이는 라벨을 유지합니다. validations.required가 true이면 답변을 요구합니다. 그렇지 않으면 _No response_를 렌더링합니다. |
dropdown | 보이는 라벨과 옵션을 유지합니다. 정확한 선택된 옵션 텍스트를 요구합니다. 단일 선택은 하나의 선택을 가지며, 다중 선택은 선언된 옵션 순서대로 선택을 유지합니다. 필수 드롭다운은 최소한 하나의 유효한 선택이 필요합니다. 선택 사항 드롭다운에서 선택이 없으면 _No response_를 렌더링합니다. |
checkboxes | 보이는 라벨과 모든 옵션을 선언된 순서대로 - [x] 또는 - [ ]로 유지합니다. 개별적으로 필수인 체크박스를 강제합니다. 에이전트가 확인 가능한 운영 옵션의 경우, 사전에 작업을 완료하고 보유한 증거로만 표시합니다. 에이전트는 자신의 증거로 뒷받침되는 작업에 대해서만 명시적으로 증언할 수 있으며, 자신의 행동을 사용자에게 귀속시켜서는 안 됩니다. 개인적인 사실, 동의, 법적 선언 및 기타 1인칭 사용자 주장은 명시적인 사용자 확인이 필요합니다. 이러한 사용자 선언에 대해 명시적인 1인칭 확인을 요구합니다. 체크박스를 일괄적으로 선택하지 마십시오. 게시 요청은 어떠한 체크박스도 확인하지 않습니다. |
각 답변에 대해 ### <보이는 라벨> 뒤에 구체화된 값을 렌더링합니다. textarea.attributes.render의 경우, 선언된 언어와 내용에 충분히 긴 펜스로 답변을 감쌉니다. 답변, 선택, 확인 또는 라벨을 절대 만들어내지 마십시오.
Markdown 템플릿은 알려진 증거로만 동일한 개인 BODY_FILE에 완성될 수 있습니다. 일치하는 템플릿이 없으면, 빈 이슈가 명시적으로 활성화된 경우에만 검토된 구조화된 빈 폴백을 사용합니다. 그 외에는 게시하지 않고 중단합니다.
검토 및 게시
단일 생성 시도 전에 대상, 제목, 선택된 폼 또는 허용된 폴백, 정확한 본문, 허용된 라벨을 검토합니다. 에이전트는 게시 직전에 정확한 본문의 개인정보 스캔/편집을 완료하고 그 증거를 보유해야 합니다. 개인 프로젝트 이름, 사용자 이름, 호스트 이름, 홈 경로, 자격 증명 및 개인 네트워크 주소를 재현 구조를 제거하지 않고 유용한 플레이스홀더로 대체합니다.
리포지토리 외부에 두 개인 파일을 위한 소유자 전용 임시 디렉토리를 하나 생성합니다. 현재 사용자로 제한하고 모든 종료/결과 시 두 파일을 정리합니다:
umask 077
REPO_ROOT="$(git rev-parse --show-toplevel)" || exit 1
REPO_ROOT="$(cd "$REPO_ROOT" && pwd -P)" || exit 1
if [ "$REPO_ROOT" = "/" ]; then
printf '%s\n' "임시 디렉토리가 리포지토리 내부에 있습니다" >&2; exit 1
fi
TMP_DIR="$(TMPDIR=/tmp mktemp -d /tmp/gentle-ai-issue.XXXXXXXX)" || exit 1
trap 'rm -rf -- "$TMP_DIR"' EXIT
TMP_DIR_REAL="$(cd "$TMP_DIR" && pwd -P)" || exit 1
case "$TMP_DIR_REAL/" in
"$REPO_ROOT/") printf '%s\n' "임시 디렉토리가 리포지토리 내부에 있습니다" >&2; exit 1 ;;
esac
chmod 700 "$TMP_DIR_REAL"
BODY_FILE="$TMP_DIR_REAL/body.md"
READBACK_FILE="$TMP_DIR_REAL/readback.json"
자동화 경로를 통해 한 번의 변경 시도를 하고 정확히 한 번 게시합니다:
gh issue create --repo "$TARGET" --title "$TITLE" --body-file "$BODY_FILE" "${LABEL_ARGS[@]}"
위의 폼 결정에 따라 브라우저 완성이 가능한 경우, 선택 사항으로 별도의 브라우저 전환이 리포지토리 폼을 열 수 있습니다. 이는 게시 증명이 아니며, 잘못된 스키마나 누락/모호한 필수 답변에 대한 응답도 아닙니다:
gh issue create --repo "$TARGET" --web
시간 초과, 네트워크 오류, 신원 누락 또는 기타 불확실한 결과에 대해 재시도하지 마십시오. 반환된 이슈 번호를 캡처한 다음, 성공을 보고하기 전에 확인된 대상 호스트에서 다시 읽어옵니다:
gh issue view "$NUMBER" --repo "$TARGET" --json number,url,title,body,state,labels >"$READBACK_FILE"
읽어온 결과가 대상 호스트 이슈를 식별하고, 제목과 본문이 CRLF-to-LF 및 후행 최종 개행 정규화 후에만 일치하는지 확인합니다. 이 대상 호스트 읽어오기 후에만 confirmed를 보고합니다. 그렇지 않으면, 권위 있는 거부로 이슈가 생성되지 않았음이 입증되면 no_write를 보고하거나, unknown을 보고하고 이후 모든 변경을 중단합니다.
분류
이슈를 승인하거나 닫기 전에, 이슈가 구체적이고, 중복되지 않으며, 증거가 충분하고, 범위 내에 있으며, 리포지토리 라벨/상태 정책과 일관되는지 확인합니다. 어떤 지점이라도 불확실한 경우, 리포지토리 검토 상태를 유지하고 가장 작은 누락 증거를 요청합니다.