skills/emasoft/ghe-thread-manager/SKILL.md
Use this skill when the user expresses ANY intent related to issue/thread management: - Switching issues: "let's work on X", "switch to #Y", "go to the auth issue" - Checking status: "what are we working on?", "current issue?", "status?" - Background work: "what's in background?", "any features ready?", "check progress" - Starting development: "implement X", "add feature", "fix bug Y", "build a..." - Joining reviews: "let me see the review", "check that feature", "join #X" - Pausing/resuming: "pause this", "come back later", "resume #X" - Stopping transcription: "stop tracking", "don't record this", "private mode" - Resuming last session: "what were we working on?", "resume last issue", "continue where we left off" - Any natural expression of wanting to change focus or check work status This skill interprets natural language - users should NOT memorize commands. For the full GHE workflow protocol, see skill: github-elements-tracking
npx skillsauth add aiskillstore/marketplace ghe-thread-managerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
THIS LAW IS ABSOLUTE AND ADMITS NO EXCEPTIONS.
Violation of this law invalidates all work produced.
When running as a background agent, you may ONLY write to:
Do NOT write outside these locations.
ALL reports MUST be posted to BOTH locations:
Report naming: <TIMESTAMP>_<title or description>_(<AGENT>).md
Timestamp format: YYYYMMDDHHMMSSTimezone
ALL 11 agents write here: Athena, Hephaestus, Artemis, Hera, Themis, Mnemosyne, Hermes, Ares, Chronos, Argos Panoptes, Cerberus
REQUIREMENTS/ is SEPARATE - permanent design documents, never deleted.
Deletion Policy: DELETE ONLY when user EXPLICITLY orders deletion due to space constraints.
You are Claude. This skill teaches you how to manage GitHub issue threads and when transcription is active.
Transcription = posting conversation exchanges to GitHub issue
current_issue = NULL → Transcription OFF → Chat freely, nothing posted
current_issue = N → Transcription ON → ALL exchanges posted to Issue #N
THIS IS NON-NEGOTIABLE. You MUST inform the user whenever transcription state changes.
When transcription is ON, everything the user says becomes PUBLIC on GitHub. The user has a right to know before they share potentially sensitive information.
| Event | You MUST Say | |-------|--------------| | Transcription turns ON | "Transcription is now ACTIVE. Everything we discuss will be posted to Issue #N on GitHub." | | Transcription turns OFF | "Transcription is now OFF. Our conversation is private." | | Switching issues | "Switching transcription from Issue #OLD to Issue #NEW. Our conversation will now be posted to #NEW." | | Session resumes with active issue | "Resuming session. Transcription is ACTIVE to Issue #N - our conversation will be posted there." |
When transcription is ON:
[TRANSCRIPTION ACTIVE - Issue #N]
When transcription is OFF:
[PRIVATE CHAT - No transcription]
┌─────────────────────────────────────────────────────────────────┐
│ STATE: NO ISSUE SELECTED │
│ │
│ current_issue: null │
│ Transcription: OFF │
│ │
│ User and Claude chat normally. │
│ NOTHING is posted to GitHub. │
│ This is the DEFAULT starting state. │
│ │
│ Actions possible: │
│ • "implement X" → Create background thread, STAY in this state │
│ • "work on #42" → TRANSITION to Issue Selected state │
│ • "check status" → Report no active issue │
└───────────────────────────────────┬─────────────────────────────┘
│
User says: "work on #42"
User says: "let's discuss issue 42"
User says: "join review #99"
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ STATE: ISSUE #N SELECTED │
│ │
│ current_issue: N │
│ Transcription: ON to Issue #N │
│ │
│ EVERY exchange between User and Claude is posted to Issue #N. │
│ This creates a permanent record in GitHub. │
│ │
│ Actions possible: │
│ • "implement X" → Create background thread, STAY on #N │
│ • "switch to #50" → Change to #50, transcription follows │
│ • "stop tracking" → TRANSITION back to No Issue state │
│ • "go back" → Return to previous issue (if any) │
└─────────────────────────────────────────────────────────────────┘
| Scenario | Transcription State | What Happens | |----------|---------------------|--------------| | Fresh start | OFF | User chats with Claude, nothing posted | | User says "work on #42" | ON → #42 | All exchanges now posted to #42 | | User says "implement X" (no issue) | STAYS OFF | Background thread created, main chat stays private | | User says "implement X" (on #42) | STAYS ON → #42 | Background thread created, main chat stays on #42 | | User says "switch to #50" | ON → #50 | Transcription moves to #50 | | User says "join review #99" | ON → #99 | Transcription moves to #99 | | User says "stop tracking" | OFF | Back to private chat | | Session starts with existing issue | ON → that issue | Resume transcription |
When user asks to implement/build/fix something:
User on #42: "implement dark mode"
│
├── Create Issue #99 for dark mode (background)
│ Athena writes requirements
│ Hephaestus implements
│ (all in background)
│
└── Main conversation STAYS on #42
Transcription CONTINUES to #42
User can keep chatting with Claude
ALWAYS check state before any operation:
CURRENT_ISSUE=$(bash "${CLAUDE_PLUGIN_ROOT}/scripts/auto_transcribe.py" get-issue)
When user wants to work on a specific issue:
bash "${CLAUDE_PLUGIN_ROOT}/scripts/auto_transcribe.py" set-issue <NUMBER>
MANDATORY - Tell the user IMMEDIATELY:
"[TRANSCRIPTION ACTIVE - Issue #N]
Transcription is now ACTIVE. Everything we discuss will be posted to Issue #N on GitHub.
Say 'stop tracking' or 'go private' at any time to disable transcription."
This is the ONLY way transcription turns ON - user explicitly selects an issue.
DO NOT proceed with any further conversation until you have notified the user.
When user wants to switch to a different issue:
# Remember current for "go back" functionality
PREVIOUS=$(bash "${CLAUDE_PLUGIN_ROOT}/scripts/auto_transcribe.py" get-issue)
# Switch to new issue
bash "${CLAUDE_PLUGIN_ROOT}/scripts/auto_transcribe.py" set-issue <NEW_NUMBER>
MANDATORY - Tell the user IMMEDIATELY:
"[SWITCHING TRANSCRIPTION]
Switching from Issue #PREVIOUS to Issue #NEW. Our conversation will now be posted to #NEW on GitHub.
Say 'go back' to return to #PREVIOUS."
When user wants to stop recording:
bash "${CLAUDE_PLUGIN_ROOT}/scripts/auto_transcribe.py" clear-issue
MANDATORY - Tell the user IMMEDIATELY:
"[TRANSCRIPTION OFF]
Transcription stopped. Our conversation is now private - nothing will be posted to GitHub."
When user wants to implement/build/fix something:
# Get current issue (may be null)
PARENT=$(bash "${CLAUDE_PLUGIN_ROOT}/scripts/auto_transcribe.py" get-issue)
# Create background thread
bash "${CLAUDE_PLUGIN_ROOT}/scripts/create_feature_thread.py" <feature|bug> "<title>" "<description>" "${PARENT:-}"
IMPORTANT: This does NOT change current_issue. Main conversation continues as before.
Tell the user:
"Created Issue #N for [feature/bug]. Athena is writing requirements, then agents will implement it. I'll notify you when ready for review. We can continue our conversation [here on #PARENT / privately]."
bash "${CLAUDE_PLUGIN_ROOT}/scripts/check_review_ready.py"
Report status without changing transcription state.
When user wants to participate in a feature thread:
# This IS a switch - transcription moves to the feature thread
PREVIOUS=$(bash "${CLAUDE_PLUGIN_ROOT}/scripts/auto_transcribe.py" get-issue)
bash "${CLAUDE_PLUGIN_ROOT}/scripts/auto_transcribe.py" set-issue <FEATURE_NUMBER>
MANDATORY - Tell the user IMMEDIATELY:
"[TRANSCRIPTION ACTIVE - Issue #FEATURE]
Joined Issue #FEATURE. Everything we discuss will now be posted to this thread on GitHub.
Say 'back to #PREVIOUS' when done to return."
On session start, check if there's a saved current_issue:
CURRENT=$(bash "${CLAUDE_PLUGIN_ROOT}/scripts/auto_transcribe.py" get-issue)
MANDATORY - Tell the user IMMEDIATELY (if issue exists):
"[TRANSCRIPTION ACTIVE - Issue #N]
Resuming session with transcription ACTIVE to Issue #N. Everything we discuss will be posted there.
Say 'stop tracking' to disable transcription."
This notification MUST be the first thing you say to the user when resuming a session with an active issue.
User hasn't selected an issue but asks to implement something:
# PARENT will be empty
PARENT=$(bash "${CLAUDE_PLUGIN_ROOT}/scripts/auto_transcribe.py" get-issue)
# Create without parent link
bash "${CLAUDE_PLUGIN_ROOT}/scripts/create_feature_thread.py" feature "Dark mode" "Add dark mode toggle" ""
Tell the user:
"Created Issue #N for dark mode. Agents will handle it in background. Our conversation remains private since we haven't selected an issue to work on."
Save previous issue when switching:
# When switching FROM #42 TO #99
echo "42" > /tmp/ghe_previous_issue
# Later, when user says "go back"
PREVIOUS=$(cat /tmp/ghe_previous_issue 2>/dev/null)
if [[ -n "$PREVIOUS" ]]; then
bash "${CLAUDE_PLUGIN_ROOT}/scripts/auto_transcribe.py" set-issue "$PREVIOUS"
fi
CURRENT=$(bash "${CLAUDE_PLUGIN_ROOT}/scripts/auto_transcribe.py" get-issue)
if [[ -z "$CURRENT" || "$CURRENT" == "null" ]]; then
echo "No issue selected. Transcription is OFF. Chat is private."
else
echo "Working on Issue #$CURRENT. Transcription is ON."
fi
Detect intent to disable transcription:
bash "${CLAUDE_PLUGIN_ROOT}/scripts/auto_transcribe.py" clear-issue
When user wants to resume a previous session but doesn't remember the issue number:
The auto_transcribe.py script automatically tracks the last active issue. When you clear or switch issues, it saves the previous one to .claude/last_active_issue.json.
Check Last Issue:
# Show the last active issue details
bash "${CLAUDE_PLUGIN_ROOT}/scripts/auto_transcribe.py" get-last-issue
# Output:
# Last Active Issue Found
# Issue: #42
# Title: Implement dark mode toggle
# Last Active: 2025-01-15T10:30:00Z
Resume Last Issue (One Command):
# Automatically resume transcription to the last active issue
bash "${CLAUDE_PLUGIN_ROOT}/scripts/auto_transcribe.py" resume
This is equivalent to:
LAST=$(bash "${CLAUDE_PLUGIN_ROOT}/scripts/auto_transcribe.py" last-issue-number)
bash "${CLAUDE_PLUGIN_ROOT}/scripts/auto_transcribe.py" set-issue "$LAST"
JSON File Structure (automatically maintained):
{
"issue": 42,
"title": "Implement dark mode toggle",
"last_active": "2025-01-15T10:30:00Z"
}
Automatic Tracking:
clear-issue: Previous issue is saved automaticallyset-issue N while on another issue: Previous issue is saved automaticallyFallback - Search by User Avatar:
If last_active_issue.json doesn't exist (e.g., first session or file deleted), search GitHub:
# Get GitHub username
GITHUB_USER="${GITHUB_OWNER:-$(gh api user --jq .login 2>/dev/null || echo "")}"
# List recent issues with comments
RECENT_ISSUES=$(gh issue list --state open --json number,title,updatedAt --limit 20)
# For each issue, check if it has USER avatar in comments
for issue_num in $(echo "$RECENT_ISSUES" | jq -r '.[].number'); do
COMMENTS=$(gh issue view "$issue_num" --json comments --jq '.comments[].body')
if echo "$COMMENTS" | grep -q "avatars.githubusercontent.com/${GITHUB_USER}"; then
echo "Found: Issue #$issue_num"
LAST_CONVERSATION="$issue_num"
break # Most recently updated is first
fi
done
Response Template:
If found:
"Your last conversation was on Issue #N: [Title]. Would you like to resume? (This will turn transcription ON)"
If not found:
"I couldn't find a previous conversation thread. Would you like to start working on a specific issue?"
| User Says | Transcription Action | Script |
|-----------|---------------------|--------|
| "let's work on #42" | ON → #42 | set-issue 42 |
| "work on the login bug" | ON → found issue | set-issue N (after search) |
| "switch to #50" | ON → #50 | set-issue 50 |
| "join review #99" | ON → #99 | set-issue 99 |
| "go back" | ON → previous | set-issue PREV |
| "stop tracking" | OFF | clear-issue |
| "what issue?" | No change | get-issue (report) |
| "implement X" | No change | create-feature-thread |
| "fix bug Y" | No change | create-feature-thread |
| "status?" | No change | check-review-ready |
| "what were we working on?" | Report last | get-last-issue |
| "resume last issue" | ON → last found | resume |
| "continue where we left off" | ON → last found | resume |
When user describes issue by name, not number:
# Search GitHub
gh issue list --search "login" --json number,title --limit 5
Decision Tree:
You MUST use these notifications. They are not optional.
"[TRANSCRIPTION ACTIVE - Issue #N]
Transcription is now ACTIVE. Everything we discuss will be posted to Issue #N: [Title] on GitHub.
Say 'stop tracking' or 'go private' at any time to disable transcription."
"[SWITCHING TRANSCRIPTION]
Switching from Issue #OLD to Issue #NEW. Our conversation will now be posted to #NEW on GitHub.
Say 'go back' to return to #OLD."
"[TRANSCRIPTION OFF]
Transcription stopped. Our conversation is now private - nothing will be posted to GitHub."
"[TRANSCRIPTION ACTIVE - Issue #N]
Resuming session with transcription ACTIVE to Issue #N. Everything we discuss will be posted there.
Say 'stop tracking' to disable transcription."
"Created Issue #N for [feature]. Agents will handle it in background.
[PRIVATE CHAT - No transcription] Our conversation remains private since we haven't selected an issue to work on."
"Created Issue #N for [feature]. Agents will handle it in background.
[TRANSCRIPTION CONTINUES - Issue #MAIN] Our conversation is still being posted to Issue #MAIN."
"Issue #N ([feature]) is ready for review! Hera is conducting the code review.
Would you like to join? Warning: This will switch transcription to Issue #N."
| Script | Purpose | Changes Transcription? |
|--------|---------|------------------------|
| auto_transcribe.py set-issue N | Select issue | YES - turns ON to #N |
| auto_transcribe.py get-issue | Check current | NO |
| auto_transcribe.py clear-issue | Stop transcription | YES - turns OFF (saves previous to last_active_issue.json) |
| auto_transcribe.py get-last-issue | Show last active issue | NO |
| auto_transcribe.py last-issue-number | Get issue number only (for scripting) | NO |
| auto_transcribe.py resume | Resume last active issue | YES - turns ON to last issue |
| create_feature_thread.py | Create background thread | NO - main unchanged |
| check_review_ready.py | Check background status | NO |
EVERY transcription state change → IMMEDIATE user notification
Before transcription turns ON:
"Transcription is now ACTIVE. Everything we discuss will be posted to Issue #N on GitHub."
Before transcription turns OFF:
"Transcription is now OFF. Our conversation is private."
Never change transcription state silently. The user must always know whether their words are being made public.
Your job: Understand user intent, execute the right action, and ALWAYS tell them the current transcription state before proceeding.
development
Apple Human Interface Guidelines for content display components. Use this skill when the user asks about charts component, collection view, image view, web view, color well, image well, activity view, lockup, data visualization, content display, displaying images, rendering web content, color pickers, or presenting collections of items in Apple apps. Also use when the user says how should I display charts, what's the best way to show images, should I use a web view, how do I build a grid of items, what component shows media, or how do I present a share sheet. Cross-references: hig-foundations for color/typography/accessibility, hig-patterns for data visualization patterns, hig-components-layout for structural containers, hig-platforms for platform-specific component behavior.
tools
Automate HelpDesk tasks via Rube MCP (Composio): list tickets, manage views, use canned responses, and configure custom fields. Always search tools first for current schemas.
testing
Expert Haskell engineer specializing in advanced type systems, pure functional design, and high-reliability software. Use PROACTIVELY for type-level programming, concurrency, and architecture guidance.
tools
GraphQL gives clients exactly the data they need - no more, no less. One endpoint, typed schema, introspection. But the flexibility that makes it powerful also makes it dangerous. Without proper controls, clients can craft queries that bring down your server. This skill covers schema design, resolvers, DataLoader for N+1 prevention, federation for microservices, and client integration with Apollo/urql. Key insight: GraphQL is a contract. The schema is the API documentation. Design it carefully.