From jaan-to
Creates GitHub or GitLab issues with code references, media attachments, labels, and session context. Auto-detects repo from git remote for bug reports or feature requests.
npx claudepluginhub parhumm/jaan-to --plugin jaan-toThis skill is limited to using the following tools:
> Report clear issues to any GitHub/GitLab repo with code references, media, and smart session context.
Creates isolated Git worktrees for feature branches with prioritized directory selection, gitignore safety checks, auto project setup for Node/Python/Rust/Go, and baseline verification.
Executes implementation plans in current session by dispatching fresh subagents per independent task, with two-stage reviews: spec compliance then code quality.
Dispatches parallel agents to independently tackle 2+ tasks like separate test failures or subsystems without shared state or dependencies.
Report clear issues to any GitHub/GitLab repo with code references, media, and smart session context.
Read these before execution:
$JAAN_LEARN_DIR/jaan-to-qa-issue-report.learn.md - Project-side learned lessons${CLAUDE_PLUGIN_ROOT}/skills/qa-issue-report/LEARN.md - Plugin-side seed lessons${CLAUDE_PLUGIN_ROOT}/skills/qa-issue-report/template.md - Issue body templates per type${CLAUDE_PLUGIN_ROOT}/docs/extending/language-protocol.md - Language resolution${CLAUDE_PLUGIN_ROOT}/docs/extending/qa-issue-report-reference.md - Privacy rules, env detection, API commands, result templatesArguments: $ARGUMENTS
Parse from arguments:
owner/repo. Default: auto-detect from git remote get-url originbug, feature, improvement, question. Default: auto-detect from description or session context.--label bug,high-priority)--attach screenshot.png,error.log)If no arguments provided, proceed to session context scan (Step 0) or ask: "What issue would you like to report?"
MANDATORY — Read and execute ALL steps in: ${CLAUDE_PLUGIN_ROOT}/docs/extending/pre-execution-protocol.md
Skill name: qa-issue-report
Execute: Step 0 (Init Guard) → A (Load Lessons) → B (Resolve Template) → C (Offer Template Seeding)
MANDATORY FIRST ACTION — Before any other step, use the Read tool to read:
$JAAN_LEARN_DIR/jaan-to-qa-issue-report.learn.md
If the file exists, apply its lessons throughout this execution. If the file does not exist, continue without it.
Also read the plugin-side seed lessons:
${CLAUDE_PLUGIN_ROOT}/skills/qa-issue-report/LEARN.md
Read and apply language protocol: ${CLAUDE_PLUGIN_ROOT}/docs/extending/language-protocol.md
Override field for this skill: language_qa-issue-report
CRITICAL LANGUAGE RULE:
Keep in English always: technical terms, file paths, variable names, code snippets, error messages.
This step runs ONLY when the skill is invoked mid-session (not as the first command). If no useful session context is found, skip to Step 1.
Analyze the current conversation deeply as an intelligent observer:
Scan conversation chronologically. Build a timeline of commands run, tools used, files edited, errors encountered. Identify the user's goal ("story arc").
Search for: error messages, failed tool calls, stack traces, frustration signals ("doesn't work", "wrong", "expected X got Y"), repeated retries. Capture exact error messages verbatim.
Identify which files were being edited/read when the issue occurred. Note the sequence of changes, workarounds attempted, and relevant code snippets discussed.
Form a hypothesis about what went wrong. Identify the likely affected component/module/file. Note if it's a regression.
If signals were found:
bug if errors found, feature if user expressed a wish, improvement if performance/quality discussed[Type] description)Present to user using AskUserQuestion (in their conversation language):
Show the draft context first:
"Based on this session, it looks like you experienced an issue:
Observed issue: {draft title} {draft description — 2-3 sentences} Likely affected area: {component/file identified} Root cause hypothesis: {brief hypothesis}"
Then ask:
AskUserQuestion:
question: "Is this what you'd like to report?"
header: "Draft"
options:
- label: "Yes, report this"
description: "Continue with this draft. Only deepening questions will be asked."
- label: "No, something else"
description: "Discard this draft and start fresh."
- label: "Close, let me adjust"
description: "Edit the draft before continuing."
If --repo is provided: set TARGET_REPO to the value. Proceed to 1.3.
git remote get-url origin
Parse owner/repo from the URL. Handle all formats:
https://github.com/owner/repo.git → owner/repogit@github.com:owner/repo.git → owner/repohttps://gitlab.com/group/repo.git or https://self-hosted.com/group/subgroup/repo.gitgit@gitlab.com:group/repo.gitIf parse fails: ask user "Which repository should I file this issue to? (format: owner/repo)"
Reference: See
${CLAUDE_PLUGIN_ROOT}/docs/extending/qa-issue-report-reference.mdsection "Platform Detection & Verification" for URL pattern matching,gh/glabauth checks, GitLab token discovery chain, and verification commands.
Confirm to user: "Issues will be filed to: {TARGET_REPO} ({GitHub|GitLab})"
Priority order: explicit flags (--submit/--no-submit) → saved preference (qa_issue_report_submit in settings.yaml) → smart detection (check gh auth status for GitHub, token availability for GitLab).
If CLI/token not available: inform user, override to local-only (don't save preference — user may configure later).
Determine issue type using this priority order:
--type flag (if provided): use directlyReference: See
${CLAUDE_PLUGIN_ROOT}/docs/extending/qa-issue-report-reference.mdsection "Keyword Detection Table" for keyword-to-type mapping.
Type-to-label mapping:
| Type | GitHub Label | GitLab Label |
|---|---|---|
bug | bug | bug |
feature | enhancement | feature |
improvement | improvement | improvement |
question | question | question |
Ask targeted clarifying questions to build a complete issue. If a session draft was accepted in Step 0, only ask deepening questions.
Reference: See
${CLAUDE_PLUGIN_ROOT}/docs/extending/qa-issue-report-reference.mdsection "Clarifying Questions per Type" for the full question sets per type (bug, feature, improvement, question).
Always ask (for all types): "Is there anything else that would help understand this?"
Skip questions the user already answered in their initial description or session context.
If --attach is provided, parse comma-separated file paths or URLs.
If no --attach flag:
AskUserQuestion:
question: "Do you have screenshots, videos, or other files to attach?"
header: "Attachments"
options:
- label: "Yes, I have files"
description: "Provide file paths or URLs to attach to the issue"
- label: "No attachments"
description: "Continue without media"
If Yes: ask user for file paths or URLs. Accept multiple entries.
For each attachment: verify URLs are valid, verify local files exist via Glob. Accept images (png, jpg, gif, webp), video (mp4, mov), logs (txt, log). Warn and skip invalid paths.
Reference: See
${CLAUDE_PLUGIN_ROOT}/docs/extending/qa-issue-report-reference.mdsection "Media Upload Strategy" for platform-specific upload details (GitLab API upload, GitHub post-creation notice, local-only mode).
Based on issue details AND session context, search the codebase for related code.
From the issue description, user answers, and session context, extract:
Execute searches (stop when ~10 references found):
**/*test* or **/*spec* in related directoriesShow findings as a numbered list:
"I found these potentially related code areas:"
src/auth/login.ts:45-78—authenticateUser()functionsrc/auth/middleware.ts:12-30— JWT validation middlewaretests/auth/login.test.ts:23-45— Login tests
AskUserQuestion:
question: "Which references should I include in the issue?"
header: "Code refs"
options:
- label: "All of them"
description: "Include all found references"
- label: "Let me select"
description: "Choose specific references by number"
- label: "None"
description: "Skip code references"
If Let me select: ask for numbers. If user wants to add more: accept additional file paths.
Auto-collect without user interaction:
Reference: See
${CLAUDE_PLUGIN_ROOT}/docs/extending/qa-issue-report-reference.mdsection "Environment Detection Table" for manifest-to-stack mapping and runtime commands.
Check for manifest files and run the corresponding runtime version command.
uname -s -r -m — OS type and architecture (do NOT include hostname)git branch --show-current — Current branchFormat as a table for the issue body. Only include what was detected.
Craft a clear, descriptive title. Always in English.
Reference: See
${CLAUDE_PLUGIN_ROOT}/docs/extending/qa-issue-report-reference.mdsection "Issue Title Format" for rules and examples.
Pattern: [{Type}] {concise description} (under 80 chars).
Read the template from ${CLAUDE_PLUGIN_ROOT}/skills/qa-issue-report/template.md.
Select the matching type template (bug / feature / improvement / question) and fill all {{field}} variables using:
Merge all sources into a coherent, well-structured issue body. All issue body content must be in English.
Reference: See
${CLAUDE_PLUGIN_ROOT}/docs/extending/qa-issue-report-reference.mdsection "Variable Mapping" for complete field mapping per issue type.
Scan accumulated issue content (title + details + code references) for threat patterns. Strip hidden characters.
Reference: See
${CLAUDE_PLUGIN_ROOT}/docs/extending/threat-scan-reference.mdfor pattern tables and verdict actions.
MANDATORY before HARD STOP preview.
Reference: See
${CLAUDE_PLUGIN_ROOT}/docs/extending/qa-issue-report-reference.mdsection "Privacy Sanitization Rules" for path, credential, connection string, and personal info rules.
Apply all sanitization rules. Track the number of sanitized items for HARD STOP display.
Present the complete issue preview:
ISSUE PREVIEW
──────────────────────────────────────────
Platform: {GitHub|GitLab}
Repo: {owner/repo}
Type: {type}
Labels: {label(s)}
Title: {title}
Attach: {N file(s) | None}
Mode: {Submit to platform / Save locally}
BODY:
──────────────────────────────────────────
{full issue body — every line}
──────────────────────────────────────────
If items were sanitized in Step 10, flag:
"For privacy, {N} path(s)/value(s) have been sanitized. Please review carefully."
Ask using AskUserQuestion (in the user's conversation language):
AskUserQuestion:
question: "Does this look correct?"
header: "Approve"
options:
- label: "Yes, looks good"
description: "Proceed to save and/or submit the issue"
- label: "No, abort"
description: "Cancel — nothing will be saved or submitted"
- label: "Edit"
description: "Make changes before proceeding"
Do NOT proceed to Phase 2 without explicit approval.
GitLab local files: Upload via POST /api/v4/projects/:id/uploads → extract markdown field from response → replace placeholders in body.
GitHub local files: Mark for post-creation notification (Step 14).
URLs (both): Already embedded as markdown in body.
Write the final sanitized body to /tmp/qa-issue-body-clean.md.
Reference: See
${CLAUDE_PLUGIN_ROOT}/docs/extending/qa-issue-report-reference.mdsection "Media Upload Commands" for exact curl commands and response parsing.
Reference: See
${CLAUDE_PLUGIN_ROOT}/docs/extending/qa-issue-report-reference.mdsection "Output Path Generation" for the bash script.
Store variables: NEXT_ID, SLUG, OUTPUT_FOLDER, MAIN_FILE for potential local save.
If submit mode is local-only: skip to Step 15.
Reference: See
${CLAUDE_PLUGIN_ROOT}/docs/extending/qa-issue-report-reference.mdsection "Submission Commands" for exact GitHub (gh issue create --body-file) and GitLab (REST APIPOST /projects/:id/issues) commands, label creation, and response parsing.
If successful: capture issue URL and number. Proceed to Step 14. If failed: capture error. Continue to Step 15 for local fallback.
If GitHub platform AND local file attachments that couldn't be uploaded:
"Issue created successfully. Please add these attachments by editing the issue at {issue_url}:"
screenshot.png— drag & drop into the issue bodyerror-log.txt— drag & drop into the issue body
Reached when: local-only mode OR submission failed. Skipped if submission succeeded.
Show copy-paste ready version with platform-specific manual submit URL. Ask if user wants to save a local file. If yes: create folder, write file with YAML frontmatter + body, update index.
Reference: See
${CLAUDE_PLUGIN_ROOT}/docs/extending/qa-issue-report-reference.mdsections "Copy-Paste Ready Template", "Local Issue File Template", and "Output Path Generation" for formats and commands.
Reference: See
${CLAUDE_PLUGIN_ROOT}/docs/extending/qa-issue-report-reference.mdsection "Result Scenario Templates" for all 5 scenarios.
AskUserQuestion:
question: "Any feedback on this issue reporting experience?"
header: "Feedback"
options:
- label: "No feedback"
description: "All good, skip feedback"
- label: "Yes, I have feedback"
description: "Share feedback to improve this skill"
If Yes: ask for details, then run /jaan-to:learn-add qa-issue-report "{feedback}"