@olegkoval/agent-skills 1.22.0 → 1.23.0
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.
- package/.claude-plugin/plugin.json +4 -2
- package/.cursor-plugin/index.json +10 -0
- package/.grok-plugin/index.json +10 -0
- package/README.md +3 -1
- package/catalog/skills.json +44 -0
- package/package.json +1 -1
- package/packages/software-development/ci-fix-loop/SKILL.md +202 -0
- package/packages/software-development/ci-fix-loop/adapters/claude/plugin.json +5 -0
- package/packages/software-development/ci-fix-loop/adapters/claude/skills/ci-fix-loop/SKILL.md +203 -0
- package/packages/software-development/ci-fix-loop/adapters/codex/README.md +20 -0
- package/packages/software-development/ci-fix-loop/adapters/cursor/plugin.json +6 -0
- package/packages/software-development/ci-fix-loop/adapters/cursor/skills/ci-fix-loop/SKILL.md +203 -0
- package/packages/software-development/ci-fix-loop/adapters/grok/plugin.json +6 -0
- package/packages/software-development/ci-fix-loop/adapters/grok/skills/ci-fix-loop/SKILL.md +203 -0
- package/packages/software-development/pr-description-writer/SKILL.md +152 -0
- package/packages/software-development/pr-description-writer/adapters/claude/plugin.json +5 -0
- package/packages/software-development/pr-description-writer/adapters/claude/skills/pr-description-writer/SKILL.md +153 -0
- package/packages/software-development/pr-description-writer/adapters/codex/README.md +19 -0
- package/packages/software-development/pr-description-writer/adapters/cursor/plugin.json +6 -0
- package/packages/software-development/pr-description-writer/adapters/cursor/skills/pr-description-writer/SKILL.md +153 -0
- package/packages/software-development/pr-description-writer/adapters/grok/plugin.json +6 -0
- package/packages/software-development/pr-description-writer/adapters/grok/skills/pr-description-writer/SKILL.md +153 -0
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ci-fix-loop
|
|
3
|
+
description: >
|
|
4
|
+
Diagnose GitHub Actions CI failures in a loop: fetch the failing check logs, identify
|
|
5
|
+
the root cause, apply a targeted fix, push, and wait for the next run — repeating until
|
|
6
|
+
all checks are green or a real blocker needs a human. Use when CI is red after a push,
|
|
7
|
+
when the user says "fix CI", "make tests pass", "diagnose CI failures", or "drive this
|
|
8
|
+
to green". Direct analog of qodoloop / coderabbitloop for automated test and lint failures.
|
|
9
|
+
license: MIT
|
|
10
|
+
allowed-tools: Bash, Read, Write, Edit
|
|
11
|
+
compatibility: Codex, Claude Code, Cursor, GitHub Copilot, Windsurf, Kiro, and other Agent Skills compatible tools. Requires git and gh (GitHub CLI) authenticated, with a GitHub Actions workflow configured.
|
|
12
|
+
metadata:
|
|
13
|
+
targets: ["cursor"]
|
|
14
|
+
author: Oleg Koval
|
|
15
|
+
tags:
|
|
16
|
+
- github-actions
|
|
17
|
+
- ci
|
|
18
|
+
- testing
|
|
19
|
+
- automation
|
|
20
|
+
- loop
|
|
21
|
+
- fix
|
|
22
|
+
source: weekly-pattern-learner
|
|
23
|
+
source_reason: "qodoloop and coderabbitloop share the push→poll→diagnose→fix→repeat loop; CI failures have the same shape but no dedicated skill existed"
|
|
24
|
+
source_date: "2026-07-28"
|
|
25
|
+
---
|
|
26
|
+
<!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
|
|
27
|
+
|
|
28
|
+
> 🤖 *Auto-generated by **weekly-pattern-learner** · qodoloop and coderabbitloop share the push→poll→diagnose→fix→repeat loop; CI failures have the same shape but no dedicated skill existed*
|
|
29
|
+
|
|
30
|
+
# CI Fix Loop
|
|
31
|
+
|
|
32
|
+
Drive a GitHub Actions CI run from red to green: fetch failure logs, diagnose, apply
|
|
33
|
+
a targeted fix, push, and repeat until all required checks pass or a blocker is hit.
|
|
34
|
+
|
|
35
|
+
## Inputs
|
|
36
|
+
|
|
37
|
+
- **PR number** (optional): detect from current branch if not given.
|
|
38
|
+
- **Check names** (optional): limit to specific failing checks instead of all.
|
|
39
|
+
- **Max iterations** (default: 5)
|
|
40
|
+
|
|
41
|
+
## Workflow
|
|
42
|
+
|
|
43
|
+
### 1. Identify the PR and current CI state
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
# Detect PR from current branch
|
|
47
|
+
gh pr view --json number,headRefName,headRefOid \
|
|
48
|
+
-q '{number, branch: .headRefName, sha: .headRefOid}'
|
|
49
|
+
|
|
50
|
+
# Current check status
|
|
51
|
+
gh pr checks --json name,state,conclusion 2>/dev/null \
|
|
52
|
+
|| gh run list --branch <branch> --limit 5
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Classify each check as: `pass`, `fail`, `pending`, or `skipped`.
|
|
56
|
+
|
|
57
|
+
**Exit immediately if all required checks already pass** — nothing to do.
|
|
58
|
+
|
|
59
|
+
### 2. Loop (max 5 iterations)
|
|
60
|
+
|
|
61
|
+
#### A. Identify failing checks
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
gh pr checks --json name,state,conclusion \
|
|
65
|
+
--jq '.[] | select(.conclusion == "failure" or .state == "FAILURE")'
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
For each failing check, record: check name, workflow file, job name.
|
|
69
|
+
|
|
70
|
+
Stop if the working set is empty — all required checks are green.
|
|
71
|
+
|
|
72
|
+
#### B. Check for base-branch regression first
|
|
73
|
+
|
|
74
|
+
Before touching any code, verify the failure is not already present on `main`:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
gh run list --branch <base-branch> --workflow <workflow-name> --limit 3 \
|
|
78
|
+
--json conclusion --jq '.[].conclusion'
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
If the same check is failing on the base branch, **stop and report** —
|
|
82
|
+
this is not your PR's fault. Do not attempt a fix that masks a base-branch problem.
|
|
83
|
+
Wait for a `Base branch recovered` notice before re-trying.
|
|
84
|
+
|
|
85
|
+
#### C. Fetch failure logs
|
|
86
|
+
|
|
87
|
+
For each failing check:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# Latest run ID for this branch/workflow
|
|
91
|
+
gh run list --branch <branch> --workflow <workflow-name> --limit 1 \
|
|
92
|
+
--json databaseId --jq '.[0].databaseId'
|
|
93
|
+
|
|
94
|
+
# Fetch only failing steps (not the full log)
|
|
95
|
+
gh run view <run-id> --log-failed
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Cap log reading at ~200 lines per job — the error is almost always in the last
|
|
99
|
+
50 lines of a failed step.
|
|
100
|
+
|
|
101
|
+
#### D. Diagnose
|
|
102
|
+
|
|
103
|
+
Classify the failure before writing any code:
|
|
104
|
+
|
|
105
|
+
| Category | Examples | Fix target |
|
|
106
|
+
|---|---|---|
|
|
107
|
+
| Test failure | `FAIL TestFoo`, `AssertionError`, `expected X got Y` | Source or test |
|
|
108
|
+
| Lint / format | `gofmt`, `eslint`, `ruff`, `prettier` | Run auto-formatter |
|
|
109
|
+
| Build error | compile error, missing import, type mismatch | Source |
|
|
110
|
+
| Dependency | `npm ERR!`, missing module, lockfile mismatch | Update lockfile |
|
|
111
|
+
| CI config | YAML parse error, bad action ref, missing secret | Workflow YAML |
|
|
112
|
+
| Flaky test | same test passes on manual re-run | Re-run first; mark if it keeps failing |
|
|
113
|
+
|
|
114
|
+
For flaky-looking failures, re-run the check before touching code:
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
gh run rerun <run-id> --failed
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Wait for the rerun result. If it passes on rerun, skip this iteration and go to
|
|
121
|
+
step F to poll for the new result.
|
|
122
|
+
|
|
123
|
+
#### E. Apply a targeted fix
|
|
124
|
+
|
|
125
|
+
Fix **only** what the log names as the failure. Do not refactor surrounding code,
|
|
126
|
+
add unrelated tests, or touch files the failing step never mentioned.
|
|
127
|
+
|
|
128
|
+
Common one-liners:
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
# Go format
|
|
132
|
+
gofmt -w .
|
|
133
|
+
goimports -w .
|
|
134
|
+
|
|
135
|
+
# Node format / lint
|
|
136
|
+
npx prettier --write .
|
|
137
|
+
npx eslint --fix .
|
|
138
|
+
|
|
139
|
+
# Python
|
|
140
|
+
ruff check --fix .
|
|
141
|
+
black .
|
|
142
|
+
|
|
143
|
+
# Lockfile
|
|
144
|
+
npm install # Node
|
|
145
|
+
poetry lock --no-update # Python
|
|
146
|
+
go mod tidy # Go
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
For test failures: read the failing test and the code it exercises. Fix the code
|
|
150
|
+
or the assertion — but not both in one commit unless the test was clearly wrong
|
|
151
|
+
and the fix is trivial.
|
|
152
|
+
|
|
153
|
+
#### F. Commit and push
|
|
154
|
+
|
|
155
|
+
Stage **only the files touched in step E** — never `git add -A`, which can sweep
|
|
156
|
+
in unrelated local changes:
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
git add <files touched>
|
|
160
|
+
git commit -m "fix(ci): <what was broken> (ci-fix-loop iteration N)"
|
|
161
|
+
git push
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Confirm the push succeeded before polling. A resolved check whose fix never reached
|
|
165
|
+
the branch is worse than an unresolved one.
|
|
166
|
+
|
|
167
|
+
#### G. Wait for CI on the new SHA
|
|
168
|
+
|
|
169
|
+
Poll every ~15s (timeout ~8min) for all previously-failing checks to complete
|
|
170
|
+
on the new push:
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
gh pr checks --json name,state,conclusion,startedAt
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
Wait until all previously-failing checks show a new result (`pass` or `fail`)
|
|
177
|
+
on the current SHA. Do not act on a result that still shows the old SHA.
|
|
178
|
+
|
|
179
|
+
Go back to step A.
|
|
180
|
+
|
|
181
|
+
### 3. Report
|
|
182
|
+
|
|
183
|
+
| Field | Value |
|
|
184
|
+
|---|---|
|
|
185
|
+
| Iterations | N |
|
|
186
|
+
| Checks fixed | names + root cause |
|
|
187
|
+
| Checks blocked | names + reason (flaky / needs human / base-branch red) |
|
|
188
|
+
| Final status | all green / partial / blocked |
|
|
189
|
+
|
|
190
|
+
```
|
|
191
|
+
CI fix loop complete.
|
|
192
|
+
Iterations: 2
|
|
193
|
+
Fixed: lint (gofmt: 3 files), test (TestUserCreate — nil pointer in fixture)
|
|
194
|
+
Blocked: none
|
|
195
|
+
Status: all required checks green
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## Chaining
|
|
199
|
+
|
|
200
|
+
| Before this skill | After this skill |
|
|
201
|
+
|---|---|
|
|
202
|
+
| `olko:pr-description-writer` | `olko:qodoloop` |
|
|
203
|
+
| Any `git push` with failing CI | `olko:coderabbitloop` |
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "olko:ci-fix-loop",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Diagnose GitHub Actions CI failures in a loop: fetch failing check logs, fix, push, and repeat until green. Direct analog of qodoloop / coderabbitloop for test and lint failures.",
|
|
5
|
+
"skills": "skills/"
|
|
6
|
+
}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ci-fix-loop
|
|
3
|
+
description: >
|
|
4
|
+
Diagnose GitHub Actions CI failures in a loop: fetch the failing check logs, identify
|
|
5
|
+
the root cause, apply a targeted fix, push, and wait for the next run — repeating until
|
|
6
|
+
all checks are green or a real blocker needs a human. Use when CI is red after a push,
|
|
7
|
+
when the user says "fix CI", "make tests pass", "diagnose CI failures", or "drive this
|
|
8
|
+
to green". Direct analog of qodoloop / coderabbitloop for automated test and lint failures.
|
|
9
|
+
license: MIT
|
|
10
|
+
allowed-tools: Bash, Read, Write, Edit
|
|
11
|
+
compatibility: Codex, Claude Code, Cursor, GitHub Copilot, Windsurf, Kiro, and other Agent Skills compatible tools. Requires git and gh (GitHub CLI) authenticated, with a GitHub Actions workflow configured.
|
|
12
|
+
metadata:
|
|
13
|
+
targets: [_source-only]
|
|
14
|
+
author: Oleg Koval
|
|
15
|
+
tags:
|
|
16
|
+
- github-actions
|
|
17
|
+
- ci
|
|
18
|
+
- testing
|
|
19
|
+
- automation
|
|
20
|
+
- loop
|
|
21
|
+
- fix
|
|
22
|
+
source: weekly-pattern-learner
|
|
23
|
+
source_reason: "qodoloop and coderabbitloop share the push→poll→diagnose→fix→repeat loop; CI failures have the same shape but no dedicated skill existed"
|
|
24
|
+
source_date: "2026-07-28"
|
|
25
|
+
---
|
|
26
|
+
<!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
|
|
27
|
+
|
|
28
|
+
> 🤖 *Auto-generated by **weekly-pattern-learner** · qodoloop and coderabbitloop share the push→poll→diagnose→fix→repeat loop; CI failures have the same shape but no dedicated skill existed*
|
|
29
|
+
|
|
30
|
+
# CI Fix Loop
|
|
31
|
+
|
|
32
|
+
Drive a GitHub Actions CI run from red to green: fetch failure logs, diagnose, apply
|
|
33
|
+
a targeted fix, push, and repeat until all required checks pass or a blocker is hit.
|
|
34
|
+
|
|
35
|
+
## Inputs
|
|
36
|
+
|
|
37
|
+
- **PR number** (optional): detect from current branch if not given.
|
|
38
|
+
- **Check names** (optional): limit to specific failing checks instead of all.
|
|
39
|
+
- **Max iterations** (default: 5)
|
|
40
|
+
|
|
41
|
+
## Workflow
|
|
42
|
+
|
|
43
|
+
### 1. Identify the PR and current CI state
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
# Detect PR from current branch
|
|
47
|
+
gh pr view --json number,headRefName,headRefOid \
|
|
48
|
+
-q '{number, branch: .headRefName, sha: .headRefOid}'
|
|
49
|
+
|
|
50
|
+
# Current check status
|
|
51
|
+
gh pr checks --json name,state,conclusion 2>/dev/null \
|
|
52
|
+
|| gh run list --branch <branch> --limit 5
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Classify each check as: `pass`, `fail`, `pending`, or `skipped`.
|
|
56
|
+
|
|
57
|
+
**Exit immediately if all required checks already pass** — nothing to do.
|
|
58
|
+
|
|
59
|
+
### 2. Loop (max 5 iterations)
|
|
60
|
+
|
|
61
|
+
#### A. Identify failing checks
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
gh pr checks --json name,state,conclusion \
|
|
65
|
+
--jq '.[] | select(.conclusion == "failure" or .state == "FAILURE")'
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
For each failing check, record: check name, workflow file, job name.
|
|
69
|
+
|
|
70
|
+
Stop if the working set is empty — all required checks are green.
|
|
71
|
+
|
|
72
|
+
#### B. Check for base-branch regression first
|
|
73
|
+
|
|
74
|
+
Before touching any code, verify the failure is not already present on `main`:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
gh run list --branch <base-branch> --workflow <workflow-name> --limit 3 \
|
|
78
|
+
--json conclusion --jq '.[].conclusion'
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
If the same check is failing on the base branch, **stop and report** —
|
|
82
|
+
this is not your PR's fault. Do not attempt a fix that masks a base-branch problem.
|
|
83
|
+
Wait for a `Base branch recovered` notice before re-trying.
|
|
84
|
+
|
|
85
|
+
#### C. Fetch failure logs
|
|
86
|
+
|
|
87
|
+
For each failing check:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# Latest run ID for this branch/workflow
|
|
91
|
+
gh run list --branch <branch> --workflow <workflow-name> --limit 1 \
|
|
92
|
+
--json databaseId --jq '.[0].databaseId'
|
|
93
|
+
|
|
94
|
+
# Fetch only failing steps (not the full log)
|
|
95
|
+
gh run view <run-id> --log-failed
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Cap log reading at ~200 lines per job — the error is almost always in the last
|
|
99
|
+
50 lines of a failed step.
|
|
100
|
+
|
|
101
|
+
#### D. Diagnose
|
|
102
|
+
|
|
103
|
+
Classify the failure before writing any code:
|
|
104
|
+
|
|
105
|
+
| Category | Examples | Fix target |
|
|
106
|
+
|---|---|---|
|
|
107
|
+
| Test failure | `FAIL TestFoo`, `AssertionError`, `expected X got Y` | Source or test |
|
|
108
|
+
| Lint / format | `gofmt`, `eslint`, `ruff`, `prettier` | Run auto-formatter |
|
|
109
|
+
| Build error | compile error, missing import, type mismatch | Source |
|
|
110
|
+
| Dependency | `npm ERR!`, missing module, lockfile mismatch | Update lockfile |
|
|
111
|
+
| CI config | YAML parse error, bad action ref, missing secret | Workflow YAML |
|
|
112
|
+
| Flaky test | same test passes on manual re-run | Re-run first; mark if it keeps failing |
|
|
113
|
+
|
|
114
|
+
For flaky-looking failures, re-run the check before touching code:
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
gh run rerun <run-id> --failed
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Wait for the rerun result. If it passes on rerun, skip this iteration and go to
|
|
121
|
+
step F to poll for the new result.
|
|
122
|
+
|
|
123
|
+
#### E. Apply a targeted fix
|
|
124
|
+
|
|
125
|
+
Fix **only** what the log names as the failure. Do not refactor surrounding code,
|
|
126
|
+
add unrelated tests, or touch files the failing step never mentioned.
|
|
127
|
+
|
|
128
|
+
Common one-liners:
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
# Go format
|
|
132
|
+
gofmt -w .
|
|
133
|
+
goimports -w .
|
|
134
|
+
|
|
135
|
+
# Node format / lint
|
|
136
|
+
npx prettier --write .
|
|
137
|
+
npx eslint --fix .
|
|
138
|
+
|
|
139
|
+
# Python
|
|
140
|
+
ruff check --fix .
|
|
141
|
+
black .
|
|
142
|
+
|
|
143
|
+
# Lockfile
|
|
144
|
+
npm install # Node
|
|
145
|
+
poetry lock --no-update # Python
|
|
146
|
+
go mod tidy # Go
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
For test failures: read the failing test and the code it exercises. Fix the code
|
|
150
|
+
or the assertion — but not both in one commit unless the test was clearly wrong
|
|
151
|
+
and the fix is trivial.
|
|
152
|
+
|
|
153
|
+
#### F. Commit and push
|
|
154
|
+
|
|
155
|
+
Stage **only the files touched in step E** — never `git add -A`, which can sweep
|
|
156
|
+
in unrelated local changes:
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
git add <files touched>
|
|
160
|
+
git commit -m "fix(ci): <what was broken> (ci-fix-loop iteration N)"
|
|
161
|
+
git push
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Confirm the push succeeded before polling. A resolved check whose fix never reached
|
|
165
|
+
the branch is worse than an unresolved one.
|
|
166
|
+
|
|
167
|
+
#### G. Wait for CI on the new SHA
|
|
168
|
+
|
|
169
|
+
Poll every ~15s (timeout ~8min) for all previously-failing checks to complete
|
|
170
|
+
on the new push:
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
gh pr checks --json name,state,conclusion,startedAt
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
Wait until all previously-failing checks show a new result (`pass` or `fail`)
|
|
177
|
+
on the current SHA. Do not act on a result that still shows the old SHA.
|
|
178
|
+
|
|
179
|
+
Go back to step A.
|
|
180
|
+
|
|
181
|
+
### 3. Report
|
|
182
|
+
|
|
183
|
+
| Field | Value |
|
|
184
|
+
|---|---|
|
|
185
|
+
| Iterations | N |
|
|
186
|
+
| Checks fixed | names + root cause |
|
|
187
|
+
| Checks blocked | names + reason (flaky / needs human / base-branch red) |
|
|
188
|
+
| Final status | all green / partial / blocked |
|
|
189
|
+
|
|
190
|
+
```
|
|
191
|
+
CI fix loop complete.
|
|
192
|
+
Iterations: 2
|
|
193
|
+
Fixed: lint (gofmt: 3 files), test (TestUserCreate — nil pointer in fixture)
|
|
194
|
+
Blocked: none
|
|
195
|
+
Status: all required checks green
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## Chaining
|
|
199
|
+
|
|
200
|
+
| Before this skill | After this skill |
|
|
201
|
+
|---|---|
|
|
202
|
+
| `olko:pr-description-writer` | `olko:qodoloop` |
|
|
203
|
+
| Any `git push` with failing CI | `olko:coderabbitloop` |
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pr-description-writer
|
|
3
|
+
description: >
|
|
4
|
+
Draft and post a GitHub PR title and body from git diff and commit history. Use when
|
|
5
|
+
opening a new PR, when the user asks to "write a PR description", "draft a PR", "open
|
|
6
|
+
a PR for this branch", or after running the git-commit skill and pushing the branch.
|
|
7
|
+
Chains naturally after git-commit and before qodoloop / coderabbitloop.
|
|
8
|
+
license: MIT
|
|
9
|
+
allowed-tools: Bash, Read, Write
|
|
10
|
+
compatibility: Codex, Claude Code, Cursor, GitHub Copilot, Windsurf, Kiro, and other Agent Skills compatible tools. Requires git and gh (GitHub CLI) authenticated.
|
|
11
|
+
metadata:
|
|
12
|
+
targets: [_source-only]
|
|
13
|
+
author: Oleg Koval
|
|
14
|
+
tags:
|
|
15
|
+
- git
|
|
16
|
+
- github
|
|
17
|
+
- pull-request
|
|
18
|
+
- description
|
|
19
|
+
- pr
|
|
20
|
+
- workflow
|
|
21
|
+
source: weekly-pattern-learner
|
|
22
|
+
source_reason: "qodoloop and coderabbitloop both open with gh pr view — the PR creation/description step was never codified as its own skill"
|
|
23
|
+
source_date: "2026-07-28"
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
> 🤖 *Auto-generated by **weekly-pattern-learner** · qodoloop and coderabbitloop both open with `gh pr view` — the PR creation/description step was never codified as its own skill*
|
|
27
|
+
|
|
28
|
+
# PR Description Writer
|
|
29
|
+
|
|
30
|
+
Draft a GitHub-ready PR title and body from the branch's commit history and diff, then
|
|
31
|
+
create or update the PR so reviewers and AI tools have full context.
|
|
32
|
+
|
|
33
|
+
## Inputs
|
|
34
|
+
|
|
35
|
+
- **Base branch** (optional, default: `main` or `master` — detect from `gh repo view`)
|
|
36
|
+
- **Draft mode** (optional, default: off)
|
|
37
|
+
- **Template** (optional): if `.github/pull_request_template.md` exists, use its section headings
|
|
38
|
+
|
|
39
|
+
## Workflow
|
|
40
|
+
|
|
41
|
+
### 1. Gather branch context
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# Current branch
|
|
45
|
+
git rev-parse --abbrev-ref HEAD
|
|
46
|
+
|
|
47
|
+
# Base branch
|
|
48
|
+
gh repo view --json defaultBranchRef -q '.defaultBranchRef.name'
|
|
49
|
+
|
|
50
|
+
# Commits since base
|
|
51
|
+
git log <base>..<head> --oneline --no-merges
|
|
52
|
+
|
|
53
|
+
# Diff summary (full diff for small PRs, stat-only for large)
|
|
54
|
+
git diff <base>..<head> --stat
|
|
55
|
+
git diff <base>..<head> # only if total changes < ~500 lines
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
If the diff is large (>500 changed lines), read file-by-file rather than all at once.
|
|
59
|
+
|
|
60
|
+
### 2. Check for existing PR
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
gh pr view --json number,title,body,state 2>/dev/null
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
- If a PR exists in `OPEN` state: update it with `gh pr edit`.
|
|
67
|
+
- If no PR exists: create one with `gh pr create`.
|
|
68
|
+
|
|
69
|
+
### 3. Check for a PR template
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
cat .github/pull_request_template.md 2>/dev/null \
|
|
73
|
+
|| cat .github/PULL_REQUEST_TEMPLATE.md 2>/dev/null \
|
|
74
|
+
|| cat PULL_REQUEST_TEMPLATE.md 2>/dev/null
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
If a template exists, mirror its section headings and populate them. Skip sections
|
|
78
|
+
that ask for credentials, tokens, internal hostnames, or content unrelated to the diff.
|
|
79
|
+
|
|
80
|
+
### 4. Draft title and body
|
|
81
|
+
|
|
82
|
+
**Title rules:**
|
|
83
|
+
- Use Conventional Commits prefix when the branch/commits use it: `feat(scope):`, `fix:`, etc.
|
|
84
|
+
- ≤ 70 characters
|
|
85
|
+
- Imperative mood ("Add X", "Fix Y", not "Added X")
|
|
86
|
+
- Include ticket number if present in branch name (e.g. `LIN-123`, `GH-456`)
|
|
87
|
+
|
|
88
|
+
**Body sections (use the template if one was found, otherwise use this structure):**
|
|
89
|
+
|
|
90
|
+
```markdown
|
|
91
|
+
## Summary
|
|
92
|
+
- <bullet: what changed>
|
|
93
|
+
- <bullet: why>
|
|
94
|
+
|
|
95
|
+
## Changes
|
|
96
|
+
- `<file or subsystem>`: <what changed and why>
|
|
97
|
+
|
|
98
|
+
## Test plan
|
|
99
|
+
- [ ] <what to run and what result to expect>
|
|
100
|
+
- [ ] <manual steps if automated tests don't cover it>
|
|
101
|
+
|
|
102
|
+
## Notes
|
|
103
|
+
<optional: anything a reviewer should watch for, known gaps, follow-up issues>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Rules:
|
|
107
|
+
- Describe *intent*, not what the diff already shows line-by-line.
|
|
108
|
+
- If commits already have good conventional messages, use them as the skeleton.
|
|
109
|
+
- Skip any section that has nothing meaningful to say.
|
|
110
|
+
- Reference specific files, functions, or lines only when they aid navigation.
|
|
111
|
+
|
|
112
|
+
### 5. Create or update the PR
|
|
113
|
+
|
|
114
|
+
Always pass the body via a heredoc or temp file — never interpolate it into the command
|
|
115
|
+
string (quotes and newlines will break the shell):
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
# Create new PR
|
|
119
|
+
gh pr create \
|
|
120
|
+
--title "<title>" \
|
|
121
|
+
--body "$(cat <<'PRBODY'
|
|
122
|
+
<body>
|
|
123
|
+
PRBODY
|
|
124
|
+
)" \
|
|
125
|
+
--base <base> \
|
|
126
|
+
[--draft]
|
|
127
|
+
|
|
128
|
+
# Update existing PR
|
|
129
|
+
gh pr edit <number> \
|
|
130
|
+
--title "<title>" \
|
|
131
|
+
--body "$(cat <<'PRBODY'
|
|
132
|
+
<body>
|
|
133
|
+
PRBODY
|
|
134
|
+
)"
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### 6. Confirm and report
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
gh pr view --json number,title,url -q '"PR #\(.number): \(.title)\n\(.url)"'
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Print the PR number, title, and URL. If the PR was newly created, note whether
|
|
144
|
+
CI triggered automatically.
|
|
145
|
+
|
|
146
|
+
## Chaining
|
|
147
|
+
|
|
148
|
+
| Before this skill | After this skill |
|
|
149
|
+
|---|---|
|
|
150
|
+
| `olko:git-commit` + `git push` | `olko:qodoloop` |
|
|
151
|
+
| `git push -u origin <branch>` | `olko:coderabbitloop` |
|
|
152
|
+
| — | `olko:open-source-publisher` (for new repos) |
|