From hermit-scribe
Files GitHub issues and posts comments via a GitHub App bot identity. Activated by phrases like 'file as a GH issue' or 'comment on issue #NNN'.
How this skill is triggered — by the user, by Claude, or both
Slash command
/hermit-scribe:hermit-scribeThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Files a GitHub issue or posts a comment on an existing issue via a configured GitHub App bot identity.
Files a GitHub issue or posts a comment on an existing issue via a configured GitHub App bot identity.
Activate when the operator says:
Activate when the operator says:
Step 1: resolve content.
If the operator named a proposal (PROP-NNN):
Glob .claude-code-hermit/proposals/PROP-NNN-*.md to find the file.
Read frontmatter: id, title, category, session.
Read body sections: ## Context, ## Problem, ## Proposed Solution, ## Impact.
Derive the Conventional-Commits type, scope, and labels. Write the raw (pre-translation) frontmatter title and proposal body to temp files, then run:
bun "$CLAUDE_PLUGIN_ROOT/skills/hermit-scribe/file-issue.ts" classify {category} {title-file} {body-file}
It emits JSON {type, scope, labels, title_line} — title_line is <type>(<scope>): <title> (scope omitted when unresolved). Review it, then use title_line as the draft title and hold labels for Step 6. (Scope resolution reads _hermit_versions from .claude-code-hermit/config.json; hermit-filed is added by the script — it is not in labels.)
Construct draft body with the four body sections, then append:
---
*Filed via hermit-scribe · proposal={id} · session={session}*
For ad-hoc issues (no proposal): use the title and body the operator provides verbatim — no CC type/scope construction.
Then, for both proposal-backed and ad-hoc issues:
Step 1b: language normalization.
If the title or body is not already in English, translate to English. Preserve verbatim:
Translate prose, headings, and bullet text. Keep the structure (Context / Problem / Proposed Solution / Impact) and section ordering identical to the source.
The proposal file under .claude-code-hermit/proposals/ is NOT modified — translation applies only to what is sent to GitHub.
Step 2: dedup check. (proposal-backed only — skip for ad-hoc issues)
Run:
bun "$CLAUDE_PLUGIN_ROOT/skills/hermit-scribe/file-issue.ts" --check {id}
Step 3: sanitize.
Pass the draft title and body to the hermit-scribe:issue-sanitizer subagent:
DRAFT_TITLE: {draft title}
DRAFT_BODY:
{draft body}
Parse the response: split on the <<<HERMIT_SCRIBE_BODY>>> line. Everything before it (after stripping TITLE: ) is the cleaned title; everything after is the cleaned body.
Step 4: operator preview.
Present the post-translation, post-sanitization content to the operator as a single message containing, in order:
---\n*Filed via hermit-scribe...* footerLabels: hermit-filed (always); plus bug/enhancement/chore and optional homeassistant-hermit/hermit-scribe for proposal-backed issuesFile this issue? (yes / edit / cancel)If the content exceeds the channel's message-size limit (Discord: 2000 chars), split into multiple messages. The confirmation prompt MUST appear in the FINAL message only — never in the first. Do NOT replace the body with placeholders like "(see below)" — inline the full body.
Wait for the operator's response.
cancel: abort.yes: proceed to Step 5.edit: ask the operator what to change (e.g. "title", a specific body section, or a free-text correction). Apply the requested edit, re-render the preview from the start of Step 4, and ask again. Loop until yes or cancel.Step 5: write title and body to temp files.
Run mktemp -d and capture the path it prints to stdout (something like /tmp/tmp.AbCdEf). Shell state does not persist between Bash tool calls, so record the exact path from the output before using the Write tool.
Use the Write tool to create two files inside that directory:
/tmp/tmp.AbCdEf/title — the cleaned issue title (single line, no markdown formatting)./tmp/tmp.AbCdEf/body.md — the cleaned issue body markdown.Step 6: run the script.
Substitute the same path from step 5 and append the labels from the Step 1 classify output as trailing arguments. Do NOT include hermit-filed — the script always adds it.
bun "$CLAUDE_PLUGIN_ROOT/skills/hermit-scribe/file-issue.ts" \
/tmp/tmp.AbCdEf/title /tmp/tmp.AbCdEf/body.md <type-label> [<scope-label>]
For example, a capability proposal scoped to homeassistant-hermit:
bun "$CLAUDE_PLUGIN_ROOT/skills/hermit-scribe/file-issue.ts" \
/tmp/tmp.AbCdEf/title /tmp/tmp.AbCdEf/body.md enhancement homeassistant-hermit
For an ad-hoc issue (no proposal), omit the label args entirely:
bun "$CLAUDE_PLUGIN_ROOT/skills/hermit-scribe/file-issue.ts" /tmp/tmp.AbCdEf/title /tmp/tmp.AbCdEf/body.md
Capture stdout: it is the issue URL on success. Stderr has any error message.
Step 7: back-write and report.
On success:
gh_issue: {url} into the proposal's YAML frontmatter, on a new line directly after the id: field. Skip this step for ad-hoc issues (no proposal file).Filed: {url}.On error, surface the stderr. Common causes:
HERMIT_GH_APP_KEY_FILE='...' does not exist → key file path is wrong or file is missing — check .env.GH 401: Bad credentials → wrong App ID, install ID, or key file.GH 404 → App not installed on target repo, or repo name typo.GH 422 → empty title or GH validation error.Step 1: resolve content.
Use the body the operator provides verbatim. No proposal lookup, no CC title construction, no frontmatter fields.
Step 1b: language normalization.
Same rules as filing — translate prose to English, preserve identifiers/code/paths/proper nouns unchanged.
Step 2: sanitize.
Pass the draft body to the hermit-scribe:issue-sanitizer subagent with a placeholder title:
DRAFT_TITLE: (issue comment)
DRAFT_BODY:
{draft body}
Parse the response as usual (split on <<<HERMIT_SCRIBE_BODY>>>). Use only the cleaned body; discard the returned title.
Step 3: operator preview.
Present the post-sanitization content as a single message containing, in order:
Issue #NNNPost this comment? (yes / edit / cancel)If the content exceeds the channel's message-size limit (Discord: 2000 chars), split into multiple messages. The confirmation prompt MUST appear in the FINAL message only.
Wait for the operator's response.
cancel: abort.yes: proceed to Step 4.edit: ask what to change, apply the correction, re-render from the top of Step 3. Loop until yes or cancel.Step 4: write body to temp file.
Run mktemp -d and capture the path. Use the Write tool to create:
/tmp/tmp.AbCdEf/body.md — the cleaned comment body.Step 5: run the script.
bun "$CLAUDE_PLUGIN_ROOT/skills/hermit-scribe/file-issue.ts" --comment {issue-number} /tmp/tmp.AbCdEf/body.md
Capture stdout: it is the comment URL on success. Stderr has any error message.
Step 6: report.
On success: output Commented: {url}. No back-write to any proposal frontmatter.
On error, surface the stderr (same causes as filing: missing key file, bad credentials, 404, 422).
HERMIT_GH_REPO overrides the default target (gtapps/claude-code-hermit).gh_issue in the frontmatter is overwritten with the new URL (latest wins).issue-sanitizer subagent strips anything personal or specific to the operator's machine and project unless it's clearly part of an upstream hermit plugin. It does not edit for style or clarity — only for privacy.npx claudepluginhub p/gtapps-hermit-scribe-plugins-hermit-scribeOpen-source issue creation: bug reports, feature requests, and structured contribution communication. Invoke whenever task involves any interaction with issues in external repositories — filing bugs, proposing features, reporting problems, or preparing issue content for open-source projects.
Handles GitHub PR, issue, and discussion workflows: create/update PRs and issues, post comments, start discussions. Loads reference files per intent.
Generates structured issue reports for GitHub/GitLab repos with code references, media attachments, and session context. Works for bugs, features, and improvements.