From qe-framework
Files GitHub issues against the qe-framework repo from the CLI using gh. Handles PAT onboarding for first-time users. Supports bug, feature, and question issue types.
How this skill is triggered — by the user, by Claude, or both
Slash command
/qe-framework:QissueThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Let qe-framework users open GitHub issues without leaving the terminal. The skill wraps the `gh` CLI, handles one-time token onboarding via `gh auth login --with-token`, and drives issue creation through `AskUserQuestion` prompts. No custom token storage, no HTTP client — the skill delegates entirely to `gh`.
Let qe-framework users open GitHub issues without leaving the terminal. The skill wraps the gh CLI, handles one-time token onboarding via gh auth login --with-token, and drives issue creation through AskUserQuestion prompts. No custom token storage, no HTTP client — the skill delegates entirely to gh.
MANDATORY: All user confirmations MUST use the
AskUserQuestiontool. Do NOT output options as plain text. NEVER echo the raw PAT into the terminal, log files, or any committed artifact.
| Setting | Value | Override |
|---|---|---|
| Target repository | inho-team/qe-framework | /Qissue --repo owner/name |
| Required PAT scope (public repo) | public_repo | repo when --repo points to a private repo |
| Issue types | bug / feature / question | Fixed — maps to same-name labels |
Step 0.1 — gh installed?
command -v gh >/dev/null 2>&1
If missing, print the install guide for the user's platform and stop (do not attempt auto-install):
brew install ghwinget install --id GitHub.cli or scoop install ghAfter the user installs gh, ask them to re-run /Qissue.
Step 0.2 — gh authenticated?
gh auth status 2>&1
Step 1.1 — Surface the token-creation link up-front. Before asking for the token, always print the two pre-filled creation URLs so a user without a PAT can click straight through:
https://github.com/settings/tokens/new?scopes=public_repo&description=QE%20Framework%20%2FQissue
(For a private repo via --repo, swap scopes=public_repo → scopes=repo.)https://github.com/settings/personal-access-tokens/new
Select repository inho-team/qe-framework (or your target) and grant Issues: Read and write.Then use AskUserQuestion with two options — include the classic URL in the question description so the user can open it directly from the prompt:
public_repo (or repo for private targets), then re-run /Qissue after copying the token.Scope recap:
inho-team/qe-framework): public_repo.--repo): repo.Step 1.2 — Collect the PAT securely. Use AskUserQuestion with a single free-text question. Mark the question clearly so the user knows the value will be piped, not saved in the repo.
When reading the user's answer, do not echo it back, do not write it to any file in the project, do not include it in log output. Treat the value as write-only into
gh auth login --with-token.
Step 1.3 — Authenticate. Pipe the token to gh via stdin in a single isolated subshell. Never pass the token on the command line, never export it, and always unset it before the command returns.
(
PAT="<value from AskUserQuestion, passed in at invocation time only>"
printf '%s' "$PAT" | gh auth login --with-token
unset PAT
)
Hard rules for the runtime:
PAT on the gh command line (leaks via ps, /proc/<pid>/cmdline, shell job control).export PAT — that propagates it to every child process for the rest of the session.( … ) so the variable cannot survive into the parent shell or later commands.Step 1.4 — Verify.
gh auth status
On failure (bad token, wrong scopes, network), surface the gh error message verbatim and ask the user whether to retry with a new token or abort.
Step 2.1 — Pick an issue type. Use AskUserQuestion with three options:
| Label | Description |
|---|---|
bug | Something doesn't work as documented |
feature | Request for a new capability |
question | Usage question or clarification |
Step 2.2 — Title. Ask for a short title (under ~80 chars). Do not prepend [Bug] / [Feature] — the label handles categorization.
Step 2.3 — Body. Ask for the body. Suggest a template based on the type (the user may overwrite wholesale):
bug → Reproduction steps, Expected, Actual, Logs (optional).feature → Problem, Proposed solution, Alternatives considered.question → Context, What you tried, What's unclear.Step 2.4 — Append environment metadata automatically. Before submitting, append a fenced block to the body (do not ask the user). Gather values via:
QE_VERSION=$(cat plugin.json 2>/dev/null | grep -oE '"version"\s*:\s*"[^"]+"' | head -1 | sed 's/.*"\([^"]*\)"$/\1/')
NODE_VERSION=$(node --version 2>/dev/null || echo "n/a")
OS_INFO=$(uname -srm 2>/dev/null || echo "$OSTYPE")
Append:
---
**Environment**
- QE Framework: {QE_VERSION}
- OS: {OS_INFO}
- Node: {NODE_VERSION}
<sub>Submitted via QE Framework /Qissue</sub>
Default target repo is inho-team/qe-framework. If the invocation included --repo owner/name, validate the shape against ^[A-Za-z0-9._-]+/[A-Za-z0-9._-]+$ before using it; reject anything else and ask again via AskUserQuestion.
gh issue create \
--repo="${TARGET_REPO:-inho-team/qe-framework}" \
--label="$TYPE" \
--title="$TITLE" \
--body="$BODY_WITH_METADATA"
Shell-construction rules (mandatory). gh does not re-shell its flag values, but the skill must never build the call via string interpolation that gives the shell a second pass:
bash -c "gh issue create --title $TITLE ...", sh -c "...", eval, backtick/$() substitution of user input.$TITLE / $BODY_WITH_METADATA as direct shell variables whose values came straight from AskUserQuestion — no concatenation into a single command string.--flag="$VALUE" form (with =) so the value is inline-bound to the flag even if it begins with -. Do not use --flag -- "$VALUE" — gh (Cobra) treats -- as end-of-flags, and gh issue create does not accept positional args, so it fails with unknown arguments.$TARGET_REPO is only ever the post-regex-validated literal above.The command returns the new issue URL on stdout. Capture it and show it to the user as the final output:
Issue created: https://github.com/inho-team/qe-framework/issues/{N}
If gh returns an error, surface it verbatim and map common cases per the Troubleshooting table below.
gh CLI exclusively for auth and issue creation.AskUserQuestion for every user input (PAT, type, title, body, retries).inho-team/qe-framework and accept --repo owner/name override..qe/, dotfiles, repo).export the PAT, place it on a command line, or let it survive the Step 1.3 subshell.gh invocation through bash -c, sh -c, eval, or string concatenation of user input.gh is the single source of truth.gh on the user's machine.bug / feature / question are submitted (the repo must have these labels configured, or gh will warn).User: "Qissue에 버그 리포트 올리고 싶어"
→ Qissue:
1. gh 설치/인증 확인
2. 미인증 시 PAT 입력 (AskUserQuestion, 1회성)
3. 타입=bug 선택
4. 제목 · 본문 수집
5. 환경 정보 자동 첨부
6. gh issue create 호출
7. 생성된 이슈 URL 출력
User: "/Qissue --repo my-org/private-repo"
→ Qissue:
- 대상 repo를 override
- PAT scope 'repo' 필요 안내
- 이후 플로우 동일
User: "feature request 올려줄래"
→ Qissue: 타입=feature 자동 선택, 나머지 플로우 동일
| Symptom | Likely cause | Fix |
|---|---|---|
gh: command not found | gh not installed | Show Step 0.1 install guide, stop |
You are not logged into any GitHub hosts | Not authenticated | Run Step 1 onboarding |
HTTP 401: Bad credentials | PAT revoked or expired | Re-run Step 1 with a new token |
HTTP 403: Resource not accessible by integration | Scope insufficient | Public repo needs public_repo; private repo needs repo |
HTTP 404: Not Found | Repo path wrong or PAT cannot see it | Verify --repo owner/name; for private repos, confirm PAT has repo |
could not add label: 'bug' not found | Target repo missing the label | Ask the user to create the label in the repo settings, or retry without --label |
HTTP 403: API rate limit exceeded | Unauthenticated or low-rate PAT | Wait for reset window shown in response, or use a PAT with higher quota |
.qe/TASK_LOG.md when invoked as part of a PSE chain (not in normal standalone use).npx claudepluginhub inho-team/qe-framework --plugin qe-frameworkCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.