@kensio/github-issue-drafting 1.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,14 @@
1
+ {
2
+ "$schema": "https://anthropic.com/claude-code/plugin.schema.json",
3
+ "name": "github-issue-drafting",
4
+ "version": "1.13.1",
5
+ "description": "A way of drafting GitHub issues that checks every claim against the repository first.",
6
+ "author": {
7
+ "name": "Kensio Software",
8
+ "email": "hugh@kensiosoftware.co.uk"
9
+ },
10
+ "homepage": "https://kensio.ai",
11
+ "repository": "https://github.com/KensioSoftware/kensio.ai",
12
+ "license": "Apache-2.0",
13
+ "keywords": ["github", "issues", "gh", "drafting", "triage"]
14
+ }
package/README.md ADDED
@@ -0,0 +1,89 @@
1
+ # @kensio/github-issue-drafting
2
+
3
+ A way of turning a one-line note into a GitHub issue somebody can act on, packaged as an agent
4
+ skill.
5
+
6
+ The note is the easy part. "SSM params", "fix the retry backoff", "the CLI hangs on empty input" all
7
+ carry enough for the person who wrote them and too little for anybody else. Handed straight to an
8
+ LLM they produce a polished issue full of invented detail, which is worse than the note was.
9
+
10
+ ## Install
11
+
12
+ Into any agent that reads `SKILL.md`:
13
+
14
+ ```bash
15
+ npx @kensio/skills add github-issue-drafting
16
+ ```
17
+
18
+ That copies the skill directory into `.agents/skills/`, where Codex, Cursor, Copilot, Gemini CLI and
19
+ the other implementations of the specification look for one. Pass `--agent claude` for
20
+ `.claude/skills/`, `--agent copilot` for `.github/skills/`, and `--user` to install it for every
21
+ project at once.
22
+
23
+ Claude Code also takes it as a plugin:
24
+
25
+ ```bash
26
+ claude plugin marketplace add KensioSoftware/kensio.ai
27
+ claude plugin install github-issue-drafting@kensio
28
+ ```
29
+
30
+ Or pin it in a repository as a dependency:
31
+
32
+ ```bash
33
+ npm install @kensio/github-issue-drafting
34
+ ```
35
+
36
+ Every skill is also published as a zip on each
37
+ [release](https://github.com/KensioSoftware/kensio.ai/releases), for a machine with no npm reach.
38
+ Unzip it into `.agents/skills/` and it is installed.
39
+
40
+ ## What it does
41
+
42
+ **Reads the repository before drafting.** Greps for the identifiers in the note, reads the code that
43
+ would change and its tests, checks what the docs already promise, skims recent history, and searches
44
+ open and closed issues for duplicates. Half-built is the common case, and an issue asking for a
45
+ feature that already half exists embarrasses whoever filed it.
46
+
47
+ **Separates what it confirmed from what it assumed.** Anything the investigation failed to settle
48
+ comes back as a question under the draft, and goes into the body as a stated assumption.
49
+
50
+ **Splits a note that is really two issues.** One note frequently spans several pull requests, and
51
+ filed whole it becomes a branch that is hard to review and hard to stop halfway. The skill carries
52
+ the seams that yield independently shippable issues (a usable surface before what sits on top of it,
53
+ a blocked piece, a distinct usage mode) and the seams that fail (one issue per function,
54
+ implementation split from its tests, docs on their own).
55
+
56
+ **Follows the repository's conventions over its own.** An `.github/ISSUE_TEMPLATE/` wins. So does
57
+ the register of the issues already filed.
58
+
59
+ **Stops before posting.** The draft arrives in chat. Filing needs an explicit go-ahead, and then it
60
+ goes through `gh` with the type and labels that the repository actually has.
61
+
62
+ **Writes titles people can find.** Issues are indexed and they outrank pull requests. The title and
63
+ the opening paragraph are the search snippet, which makes plain words worth more than internal
64
+ shorthand. There is a line past which a title reads as written for a crawler, and the skill sets out
65
+ where it falls.
66
+
67
+ It also covers issues that already exist, retitling them and backfilling a missing type or label,
68
+ including closed ones.
69
+
70
+ ## Two things it gets right that are easy to get wrong
71
+
72
+ **Private detail.** Notes and stack traces carry customer names, internal hostnames, ticket ids,
73
+ paths with a username in them, and occasionally a token. A public issue is publication, so the skill
74
+ redacts by default and asks about anything borderline.
75
+
76
+ **Hard-wrapped bodies.** GitHub renders issue Markdown with the GFM hard-line-break extension, so
77
+ every newline inside a paragraph becomes a `<br>`. A repository whose prose wraps at 80 columns
78
+ produces visibly ragged issues the moment that habit reaches a body. Paragraphs go in as one long
79
+ line.
80
+
81
+ ## Related skills
82
+
83
+ [`technical-prose-style`](https://github.com/KensioSoftware/kensio.ai/tree/main/plugins/technical-prose-style)
84
+ and [`avoid-ai-writing`](https://github.com/conorbronsdon/avoid-ai-writing) are used for the body
85
+ text where they are installed. Neither is required.
86
+
87
+ Part of [kensio.ai](https://github.com/KensioSoftware/kensio.ai). Licensed under the Apache License
88
+ 2.0. See the [LICENSE](https://github.com/KensioSoftware/kensio.ai/blob/main/LICENSE) in the
89
+ repository root.
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@kensio/github-issue-drafting",
3
+ "version": "1.13.1",
4
+ "description": "A way of drafting GitHub issues that checks every claim against the repository first.",
5
+ "keywords": [
6
+ "agent-skills",
7
+ "claude",
8
+ "claude-code",
9
+ "claude-code-plugin",
10
+ "codex",
11
+ "copilot",
12
+ "cursor",
13
+ "gh",
14
+ "git",
15
+ "github",
16
+ "issue-tracking",
17
+ "issues",
18
+ "kensio",
19
+ "skill",
20
+ "skill-md",
21
+ "triage"
22
+ ],
23
+ "homepage": "https://kensio.ai",
24
+ "license": "Apache-2.0",
25
+ "author": "Kensio Software <hugh@kensiosoftware.co.uk>",
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "git+https://github.com/KensioSoftware/kensio.ai.git",
29
+ "directory": "plugins/github-issue-drafting"
30
+ },
31
+ "files": [
32
+ ".claude-plugin",
33
+ "skills",
34
+ "README.md"
35
+ ],
36
+ "publishConfig": {
37
+ "access": "public"
38
+ }
39
+ }
@@ -0,0 +1,260 @@
1
+ ---
2
+ name: github-issue-drafting
3
+ description: Draft a GitHub issue from a short note or a rough idea, grounding every claim about the code in the repository the issue will be filed against, splitting work that is really two issues, and filing it with `gh` once the user has approved the draft. Use when turning a to-do item, a Slack message, a code TODO, a failing test or a bug report into an issue, when asked to "write up an issue for" something, to "raise", "file" or "open an issue", when asked whether something should be one issue or several, and when tidying the titles, types or labels of issues that already exist.
4
+ license: Apache-2.0
5
+ metadata:
6
+ version: "1.13.1"
7
+ ---
8
+
9
+ # GitHub issue drafting
10
+
11
+ A short note ("fix the retry backoff", "SSM params", "the CLI hangs on empty input") carries enough
12
+ for whoever wrote it and too little for anyone else, including the same person in six months. The
13
+ job is an issue a reader can act on without asking what was meant, with every claim about the code
14
+ checked against the code.
15
+
16
+ ## Process
17
+
18
+ 1. **Get the note.** Use the text passed in as the skill argument. Ask the user for it if none
19
+ arrived. A note can come from anywhere (a to-do app, a chat message, a `TODO` comment, a stack
20
+ trace, a support thread) and the source changes nothing about the drafting.
21
+
22
+ 2. **Work out which repository this belongs to, and how it files issues.** `gh repo view` names the
23
+ repository behind the working directory. Confirm with the user where the working directory is
24
+ ambiguous or where the issue belongs somewhere else. Then read how this project already works:
25
+
26
+ - `.github/ISSUE_TEMPLATE/` and `CONTRIBUTING.md`, if present. **A repository's own template wins
27
+ over the structure in this skill.** Fill in that template and follow its wording.
28
+ - `gh issue list --limit 10` and one or two full issues (`gh issue view <n>`) for the house
29
+ register, the section headings in use, and how long a typical issue runs.
30
+
31
+ 3. **Investigate before drafting.** See
32
+ [Ground the draft in the repository](#ground-the-draft-in-the-repository).
33
+
34
+ 4. **Decide whether it is one issue or several.** See
35
+ [One note is often more than one issue](#one-note-is-often-more-than-one-issue).
36
+
37
+ 5. **Draft it**, separating what step 3 confirmed from what remains an assumption.
38
+
39
+ 6. **Present the draft in chat as markdown, and stop.** Filing is the user's call. List any open
40
+ questions under the draft so they can be answered before anything is posted.
41
+
42
+ 7. **File it with `gh` only after the user has explicitly asked.** See
43
+ [Filing the issue](#filing-the-issue).
44
+
45
+ ## Ground the draft in the repository
46
+
47
+ The failure mode that matters is invention. A feature called missing when it half exists,
48
+ architecture nobody built, acceptance criteria assuming decisions nobody has made. A note is too
49
+ short to carry that context. The repository has to supply it.
50
+
51
+ Budget a handful of tool calls for this. A full audit is more than the draft needs.
52
+
53
+ - **Locate the area.** Grep for the nouns and identifiers in the note. A `README`, an architecture
54
+ doc or the directory layout usually points at the right subtree in one step.
55
+ - **Read the code that would change, and its tests.** Half-built is the common case, and it is the
56
+ case that embarrasses the issue.
57
+ - **Read what the docs already promise.** A behaviour documented as supported and a behaviour
58
+ actually supported are different facts, and the gap between them is sometimes the issue.
59
+ - **Check the history.** `git log --oneline -20` for work in flight, and
60
+ `git log --oneline --all --grep="<keyword>"` for work already done under another name.
61
+ - **Search the tracker, including closed issues.** `gh issue list --state all --search "<keyword>"`.
62
+ A near duplicate is usually worth a comment on the existing issue. Say so and let the user pick.
63
+ Where `gh` is missing or unauthenticated, skip this quietly and never claim to have checked.
64
+
65
+ Carry the unresolved parts forward. Anything step 3 failed to settle belongs in the draft as an
66
+ explicit question or a stated assumption, and in chat as something for the user to answer.
67
+
68
+ ## One note is often more than one issue
69
+
70
+ A note is written in one breath. The work it names frequently spans several pull requests, and filed
71
+ whole it becomes one enormous branch that is hard to review and hard to stop halfway.
72
+
73
+ So before drafting, look for a seam that yields **independently shippable** issues. Seams that
74
+ usually work, roughly in build order:
75
+
76
+ - **A usable surface first, whatever sits on top of it second.** The library function is useful on
77
+ its own. The CLI flag, the config key or the framework integration exposing it reads better as a
78
+ follow-up that links back.
79
+ - **A piece blocked on something unbuilt.** Work waiting on another feature is its own issue, with
80
+ the dependency named, and not a caveat buried in this one.
81
+ - **A distinct usage mode.** The same capability reached at runtime and at build time is two
82
+ features with two sets of tests.
83
+ - **A bug fix and the hardening around it.** Ship the fix. File the class of problem separately.
84
+
85
+ Three seams produce issues nobody can ship alone. One issue per function or endpoint, implementation
86
+ split from its tests, and docs as their own issue. Docs belong with the behaviour they describe.
87
+
88
+ Two or three issues is the usual answer where a split is warranted. Five is over-slicing, and a
89
+ small self-contained note stays one issue. Where a split happens, say so in chat and present the set
90
+ together, each one naming its dependency and using **Out of scope** to hand work to the others.
91
+
92
+ ## Drafting rules
93
+
94
+ - **Keep it short, and shorter than feels right.** Roughly 200 to 350 words of prose plus at most
95
+ one example. Three or four sections at most, and no more than six acceptance criteria. Cut any
96
+ section that fails to help a reader understand, implement, test or evaluate the change.
97
+ - **The design discussion in chat is not the issue.** Working a note through produces rejected
98
+ alternatives, trade-offs and cost estimates, and almost none of it belongs in the body. Record the
99
+ decision and one sentence of reason. Where the discussion settled something genuinely surprising,
100
+ one short paragraph earns its place.
101
+ - **Never invent behaviour, architecture, supported APIs or acceptance criteria.** Where step 3 left
102
+ something unconfirmed, write it as a question or a stated assumption.
103
+ - **Scrub anything private before it goes anywhere public.** Notes and stack traces carry customer
104
+ names, internal hostnames, internal ticket ids, paths with a username in them, tokens and API
105
+ keys. A public issue is publication. Redact by default and ask about anything borderline.
106
+ - **Write to the problem, and to the observable behaviour that would fix it.** An issue is not a
107
+ pull request description, and a detailed implementation plan belongs in it only where step 3
108
+ turned up a constraint the implementer would otherwise miss.
109
+ - **Prefer one concrete example** (a command, a config snippet, a failing assertion, the exact error
110
+ text) over a paragraph of description.
111
+ - **A bug needs the version, the environment, the steps, the expected result and the actual
112
+ result.** Anything absent is a question for the user, and a bug report missing them wastes the
113
+ first reply.
114
+ - **Leave the process fields alone.** No assignees, milestones, estimates, or wording implying that
115
+ the issue is approved or scheduled. Type and labels are set at filing time.
116
+ - **When in doubt, cut.** Erring long is the more common failure. Somebody re-reading this in six
117
+ months needs the problem, the intended behaviour, and enough grounding to trust both.
118
+
119
+ ### Prose
120
+
121
+ Load the `technical-prose-style` and `avoid-ai-writing` skills before drafting where they are
122
+ installed, and run whatever check they ship over the body. Where neither is available, aim for one
123
+ claim per sentence, present tense, no em dashes, no marketing adjectives, and one name kept for one
124
+ thing.
125
+
126
+ ## Structure
127
+
128
+ Use the repository's own issue template where it has one. Otherwise draw from the sections below,
129
+ taking only those this particular note needs. Most issues use three or four. **Problem** and
130
+ **Desired behaviour** are the two that nearly always earn their place. Reach for **Current
131
+ behaviour** where what exists today would surprise a reader, and for **Implementation notes** only
132
+ where step 3 turned up a real constraint.
133
+
134
+ ```markdown
135
+ # Title
136
+
137
+ ## Problem
138
+
139
+ The concrete limitation, missing capability or user need.
140
+
141
+ ## Current behaviour
142
+
143
+ What happens today, grounded in what the repository actually shows. Omit where unknown.
144
+
145
+ ## Desired behaviour
146
+
147
+ The observable behaviour that should exist once this is implemented.
148
+
149
+ ## Example
150
+
151
+ A command, config, request or expected result. Include it only where it clarifies something.
152
+
153
+ ## Acceptance criteria
154
+
155
+ Testable checklist items.
156
+
157
+ ## Out of scope
158
+
159
+ Related work that should not be assumed to be included.
160
+
161
+ ## Implementation notes
162
+
163
+ Grounded constraints from the investigation. Omit the section entirely where there are none.
164
+ ```
165
+
166
+ For a bug, replace the middle three with **Steps to reproduce**, **Expected result**, **Actual
167
+ result** and **Environment** (version, runtime, operating system, anything version-pinned that
168
+ matters).
169
+
170
+ ## Titles people can find
171
+
172
+ Issues get indexed, by GitHub's search and by search engines, and they surface far more readily than
173
+ pull requests do. For a public repository the title and the opening paragraph are the whole search
174
+ snippet, and they do nearly all the work of getting the issue in front of the person who has the
175
+ problem.
176
+
177
+ - **Write the words a user would type.** Internal shorthand and internal abbreviations describe the
178
+ problem to people who already know it. Spell them out.
179
+ - **Keep the term that makes the project distinctive**, even while cutting shorthand around it. The
180
+ two look like the same edit and are opposites. An abbreviation nobody searches for should go. The
181
+ one accurate word separating this project from every other page about the same topic should stay,
182
+ because a title without it competes with the upstream documentation and loses.
183
+ - **Front-load.** Search snippets truncate around 60 characters, so anything load-bearing goes
184
+ early.
185
+ - **Generic verbs are weak alone.** "add", "support", "fix" are fine where the sentence wants them
186
+ anyway. They differentiate nothing on their own, and forcing one in is where a title starts
187
+ sounding written for a crawler.
188
+ - **Keep it subtle.** An issue that reads as search filler makes a project look automated, and costs
189
+ more credibility than the traffic is worth. Aim for a title a developer would have written anyway,
190
+ which happens to use the words someone with this problem would search for.
191
+ - **Be honest about the size of the prize.** On a small repository these titles win long-tail
192
+ queries. That makes the work worth doing and never worth distorting a title for.
193
+
194
+ `SSR hydration bug in the DS button` becomes
195
+ `Design system button loses its click handler after server-side rendering`. The second expands the
196
+ shorthand nobody searches for, keeps the words that place the problem, and adds nothing that is
197
+ untrue of the bug.
198
+
199
+ On a private repository the audience is the team, and all of this reduces to one rule. Say what the
200
+ problem is in plain words.
201
+
202
+ ## Filing the issue
203
+
204
+ Only once the user has explicitly asked.
205
+
206
+ Write the body to a file and pass it with `--body-file`, so quoting and backticks survive intact:
207
+
208
+ ```bash
209
+ gh issue create --repo <owner>/<repo> --title "<title>" --body-file <path> --label <label>
210
+ ```
211
+
212
+ **Do not hard-wrap the body.** This is the one formatting trap. GitHub renders issue and comment
213
+ Markdown with the GFM hard-line-break extension, so every newline inside a paragraph becomes a
214
+ `<br>`. A repository whose prose style wraps at 80 or 100 columns will produce visibly ragged output
215
+ when that habit reaches an issue body. Write each paragraph and each list item as one long line.
216
+ Blank lines between blocks still separate paragraphs, and code fences and list structure are
217
+ unaffected.
218
+
219
+ **Labels.** Read `gh label list` and pick from what exists. A label passed to `gh` that the
220
+ repository lacks fails the whole command.
221
+
222
+ **Type,** where the organisation has issue types configured. `--type` takes one of them (`Bug`,
223
+ `Feature` and `Task` are the GitHub defaults). Its value is in-repo filtering and a readable issue
224
+ list. Where the flag or the type is rejected, drop it and carry on.
225
+
226
+ **Think before applying `good first issue` or `help wanted`.** GitHub surfaces both in its
227
+ contributor-discovery UI, and third-party sites scrape them to list approachable open-source work.
228
+ For a project actively recruiting contributors that is the point. For a solo maintainer it invites
229
+ drive-by pull requests that cost more to review than they return. `CONTRIBUTING.md` and the existing
230
+ issues usually say which kind of project this is. Where it stays unclear, leave both off and mention
231
+ it.
232
+
233
+ **Skip Projects and date fields** unless the user asks for them. They are planning tools with
234
+ recurring upkeep and no search benefit. Milestones are the lighter option for grouping.
235
+
236
+ Where several issues came out of one note, file them in dependency order and put each preceding URL
237
+ into the issue that depends on it.
238
+
239
+ After filing, report the URL and state plainly which type and labels were applied.
240
+
241
+ ## Revisiting existing issues
242
+
243
+ The same thinking applies to issues that already exist, whether retitling or backfilling a missing
244
+ type or label. Closed issues are worth including. They stay indexed, and a closed issue describing a
245
+ capability that now exists is often exactly what a searcher wants.
246
+
247
+ Retitling is cheap and low-risk (the URL survives, GitHub keeps the edit history, nobody gets
248
+ notified) and it is still a public edit. Propose the full set in chat and get an explicit go-ahead
249
+ before running any `gh issue edit`. A table of current against proposed makes the set easy to scan
250
+ and easy to reject one row at a time.
251
+
252
+ Two things to watch in bulk:
253
+
254
+ - **A run of near-identical titles is a real cost.** One formula applied across five issues makes
255
+ the list scannable and reads as a deliberate series. A shared long prefix is also the first thing
256
+ a sceptical reader notices. Accept it where the issues genuinely are one series, and vary the
257
+ phrasing on a couple where the run gets long.
258
+ - **The bodies are usually the bigger win.** The opening paragraph becomes the search snippet, so a
259
+ retitled issue still opening with internal shorthand has had half the job done. Rewriting the
260
+ first sentence of **Problem** often beats the title edit.