@olegkoval/agent-skills 1.49.0 → 1.49.2
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/.github/prompts/codexloop.prompt.md +15 -2
- package/.kiro/steering/codexloop.md +14 -1
- package/.windsurf/rules/codexloop.md +14 -1
- package/README.md +6 -1
- package/adapters/claude/olko-github-pr/skills/codexloop/SKILL.md +15 -2
- package/adapters/claude/olko-reflection/skills/agent-ops-retro/scripts/mine-transcripts.mjs +10 -2
- package/adapters/cursor/olko-github-pr/skills/codexloop/SKILL.md +15 -2
- package/adapters/cursor/olko-reflection/skills/agent-ops-retro/scripts/mine-transcripts.mjs +10 -2
- package/adapters/grok/olko-github-pr/skills/codexloop/SKILL.md +15 -2
- package/adapters/grok/olko-reflection/skills/agent-ops-retro/scripts/mine-transcripts.mjs +10 -2
- package/catalog/skills.json +1 -1
- package/package.json +1 -1
- package/plugins/olko-apple-kit/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-creative/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-garmin-kit/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-git-tools/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-github-pr/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-github-pr/skills/codexloop/SKILL.md +15 -2
- package/plugins/olko-obsidian/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-product/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-reflection/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-reflection/skills/agent-ops-retro/scripts/mine-transcripts.mjs +10 -2
- package/plugins/olko-release/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-skill-meta/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-web-ops/.claude-plugin/plugin.json +1 -1
- package/site/build.mjs +3 -0
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
description: "Iteratively drives a GitHub PR to zero unresolved OpenAI Codex review comments, verifying every finding against the real code first, fixes only the correct ones, and rebuts false positives without changing correct code."
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Use the
|
|
7
|
+
Use the codexloop skill.
|
|
8
8
|
|
|
9
9
|
# Codexloop
|
|
10
10
|
|
|
@@ -63,6 +63,12 @@ Switch to the PR branch if not already on it. Capture `OWNER`/`REPO` (`gh repo v
|
|
|
63
63
|
|
|
64
64
|
## 2. The loop (max 5 iterations)
|
|
65
65
|
|
|
66
|
+
At the end of every invocation, post exactly one top-level PR conversation comment summarizing
|
|
67
|
+
the result, including iterations, comments fixed, comments rebutted, and anything remaining. This
|
|
68
|
+
is required even when the loop times out or reaches its iteration cap; report that state honestly.
|
|
69
|
+
End the comment with: **Useful? React with 👍 / 👎.** Do not post a separate summary comment for
|
|
70
|
+
each iteration.
|
|
71
|
+
|
|
66
72
|
Keep an explicit iteration counter and stop at 5: the cap is a real bound to enforce, not a
|
|
67
73
|
figure of speech. Each pass through A–G is one iteration; on hitting the cap, go straight to the
|
|
68
74
|
report and list what is still unresolved rather than starting a sixth.
|
|
@@ -184,6 +190,10 @@ gh pr view <PR> --json headRefOid -q .headRefOid # must match
|
|
|
184
190
|
|
|
185
191
|
If they differ, stop: the fix is not on the PR, so nothing may be resolved yet.
|
|
186
192
|
|
|
193
|
+
Every fixed Codex thread must be replied to and resolved after this push is verified. A fix is not
|
|
194
|
+
complete while its thread remains unresolved. If no code changed, rebutted threads can be replied
|
|
195
|
+
to and resolved without a push.
|
|
196
|
+
|
|
187
197
|
### F. Reply to and resolve every addressed thread
|
|
188
198
|
|
|
189
199
|
Only now, with the fixes pushed, reply and resolve. Fetch unresolved threads, **following
|
|
@@ -220,7 +230,10 @@ gh api graphql -f query='mutation { resolveReviewThread(input: {threadId: "THREA
|
|
|
220
230
|
```
|
|
221
231
|
|
|
222
232
|
Resolve a thread only for comments authored by `$BOT` that you have fixed or rebutted: never
|
|
223
|
-
blanket-resolve, and never resolve a human reviewer's thread.
|
|
233
|
+
blanket-resolve, and never resolve a human reviewer's thread. For each fixed comment, verify the
|
|
234
|
+
push first, reply with the change made, then resolve the thread and verify `isResolved: true`.
|
|
235
|
+
For each rebutted comment, reply with the evidence and verify resolution. Do not report a comment
|
|
236
|
+
as fixed or rebutted until its thread is confirmed resolved.
|
|
224
237
|
|
|
225
238
|
Threads you are **rebutting** need no push, so they may be replied to and resolved regardless of
|
|
226
239
|
whether step D changed code.
|
|
@@ -62,6 +62,12 @@ Switch to the PR branch if not already on it. Capture `OWNER`/`REPO` (`gh repo v
|
|
|
62
62
|
|
|
63
63
|
## 2. The loop (max 5 iterations)
|
|
64
64
|
|
|
65
|
+
At the end of every invocation, post exactly one top-level PR conversation comment summarizing
|
|
66
|
+
the result, including iterations, comments fixed, comments rebutted, and anything remaining. This
|
|
67
|
+
is required even when the loop times out or reaches its iteration cap; report that state honestly.
|
|
68
|
+
End the comment with: **Useful? React with 👍 / 👎.** Do not post a separate summary comment for
|
|
69
|
+
each iteration.
|
|
70
|
+
|
|
65
71
|
Keep an explicit iteration counter and stop at 5: the cap is a real bound to enforce, not a
|
|
66
72
|
figure of speech. Each pass through A–G is one iteration; on hitting the cap, go straight to the
|
|
67
73
|
report and list what is still unresolved rather than starting a sixth.
|
|
@@ -183,6 +189,10 @@ gh pr view <PR> --json headRefOid -q .headRefOid # must match
|
|
|
183
189
|
|
|
184
190
|
If they differ, stop: the fix is not on the PR, so nothing may be resolved yet.
|
|
185
191
|
|
|
192
|
+
Every fixed Codex thread must be replied to and resolved after this push is verified. A fix is not
|
|
193
|
+
complete while its thread remains unresolved. If no code changed, rebutted threads can be replied
|
|
194
|
+
to and resolved without a push.
|
|
195
|
+
|
|
186
196
|
### F. Reply to and resolve every addressed thread
|
|
187
197
|
|
|
188
198
|
Only now, with the fixes pushed, reply and resolve. Fetch unresolved threads, **following
|
|
@@ -219,7 +229,10 @@ gh api graphql -f query='mutation { resolveReviewThread(input: {threadId: "THREA
|
|
|
219
229
|
```
|
|
220
230
|
|
|
221
231
|
Resolve a thread only for comments authored by `$BOT` that you have fixed or rebutted: never
|
|
222
|
-
blanket-resolve, and never resolve a human reviewer's thread.
|
|
232
|
+
blanket-resolve, and never resolve a human reviewer's thread. For each fixed comment, verify the
|
|
233
|
+
push first, reply with the change made, then resolve the thread and verify `isResolved: true`.
|
|
234
|
+
For each rebutted comment, reply with the evidence and verify resolution. Do not report a comment
|
|
235
|
+
as fixed or rebutted until its thread is confirmed resolved.
|
|
223
236
|
|
|
224
237
|
Threads you are **rebutting** need no push, so they may be replied to and resolved regardless of
|
|
225
238
|
whether step D changed code.
|
|
@@ -61,6 +61,12 @@ Switch to the PR branch if not already on it. Capture `OWNER`/`REPO` (`gh repo v
|
|
|
61
61
|
|
|
62
62
|
## 2. The loop (max 5 iterations)
|
|
63
63
|
|
|
64
|
+
At the end of every invocation, post exactly one top-level PR conversation comment summarizing
|
|
65
|
+
the result, including iterations, comments fixed, comments rebutted, and anything remaining. This
|
|
66
|
+
is required even when the loop times out or reaches its iteration cap; report that state honestly.
|
|
67
|
+
End the comment with: **Useful? React with 👍 / 👎.** Do not post a separate summary comment for
|
|
68
|
+
each iteration.
|
|
69
|
+
|
|
64
70
|
Keep an explicit iteration counter and stop at 5: the cap is a real bound to enforce, not a
|
|
65
71
|
figure of speech. Each pass through A–G is one iteration; on hitting the cap, go straight to the
|
|
66
72
|
report and list what is still unresolved rather than starting a sixth.
|
|
@@ -182,6 +188,10 @@ gh pr view <PR> --json headRefOid -q .headRefOid # must match
|
|
|
182
188
|
|
|
183
189
|
If they differ, stop: the fix is not on the PR, so nothing may be resolved yet.
|
|
184
190
|
|
|
191
|
+
Every fixed Codex thread must be replied to and resolved after this push is verified. A fix is not
|
|
192
|
+
complete while its thread remains unresolved. If no code changed, rebutted threads can be replied
|
|
193
|
+
to and resolved without a push.
|
|
194
|
+
|
|
185
195
|
### F. Reply to and resolve every addressed thread
|
|
186
196
|
|
|
187
197
|
Only now, with the fixes pushed, reply and resolve. Fetch unresolved threads, **following
|
|
@@ -218,7 +228,10 @@ gh api graphql -f query='mutation { resolveReviewThread(input: {threadId: "THREA
|
|
|
218
228
|
```
|
|
219
229
|
|
|
220
230
|
Resolve a thread only for comments authored by `$BOT` that you have fixed or rebutted: never
|
|
221
|
-
blanket-resolve, and never resolve a human reviewer's thread.
|
|
231
|
+
blanket-resolve, and never resolve a human reviewer's thread. For each fixed comment, verify the
|
|
232
|
+
push first, reply with the change made, then resolve the thread and verify `isResolved: true`.
|
|
233
|
+
For each rebutted comment, reply with the evidence and verify resolution. Do not report a comment
|
|
234
|
+
as fixed or rebutted until its thread is confirmed resolved.
|
|
222
235
|
|
|
223
236
|
Threads you are **rebutting** need no push, so they may be replied to and resolved regardless of
|
|
224
237
|
whether step D changed code.
|
package/README.md
CHANGED
|
@@ -13,6 +13,10 @@ Agent-agnostic skill collection for Codex, Claude, Cursor, Grok, and other skill
|
|
|
13
13
|
|
|
14
14
|
**Browse the catalog: [skills.olegkoval.com](https://skills.olegkoval.com)**
|
|
15
15
|
|
|
16
|
+
**A separate project by Oleg:** [Factory](https://factory.olegkoval.com/) is an MIT-licensed
|
|
17
|
+
skill for Claude Code and Codex that makes delivery claims answer to acceptance criteria and
|
|
18
|
+
evidence. [Inspect one full documented run](https://factory.olegkoval.com/case-studies/development-hydration-warning/).
|
|
19
|
+
|
|
16
20
|
These skills are opinionated by design. They encode working defaults, preferred tools, and repeatable workflows instead of trying to be neutral snippets. Treat them as starting points with taste: useful out of the box, easy to inspect, and specific enough for an agent to execute consistently.
|
|
17
21
|
|
|
18
22
|
```
|
|
@@ -111,7 +115,8 @@ cd agent-skills
|
|
|
111
115
|
./scripts/install-codex-symlinks.sh
|
|
112
116
|
```
|
|
113
117
|
|
|
114
|
-
Then mention a lookup name in a new Codex session
|
|
118
|
+
Then mention a lookup name in a new Codex session. The Codexloop skill is available directly as
|
|
119
|
+
`$codexloop` (or by name in a prompt):
|
|
115
120
|
|
|
116
121
|
```text
|
|
117
122
|
Use the olko:semantic-release-beta skill to add prereleases on a beta branch.
|
|
@@ -8,7 +8,7 @@ description: >
|
|
|
8
8
|
review", "fix codex comments", "codex loop", or wants to iterate on Codex PR review feedback.
|
|
9
9
|
compatibility: GitHub only (Codex code review is a GitHub app). Requires git + gh (GitHub CLI) authenticated, and the Codex / ChatGPT connector app installed on the repo with code review enabled.
|
|
10
10
|
metadata:
|
|
11
|
-
version: "1.
|
|
11
|
+
version: "1.1"
|
|
12
12
|
allowed-tools: Bash(gh:*) Bash(git:*)
|
|
13
13
|
---
|
|
14
14
|
<!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
|
|
@@ -70,6 +70,12 @@ Switch to the PR branch if not already on it. Capture `OWNER`/`REPO` (`gh repo v
|
|
|
70
70
|
|
|
71
71
|
## 2. The loop (max 5 iterations)
|
|
72
72
|
|
|
73
|
+
At the end of every invocation, post exactly one top-level PR conversation comment summarizing
|
|
74
|
+
the result, including iterations, comments fixed, comments rebutted, and anything remaining. This
|
|
75
|
+
is required even when the loop times out or reaches its iteration cap; report that state honestly.
|
|
76
|
+
End the comment with: **Useful? React with 👍 / 👎.** Do not post a separate summary comment for
|
|
77
|
+
each iteration.
|
|
78
|
+
|
|
73
79
|
Keep an explicit iteration counter and stop at 5: the cap is a real bound to enforce, not a
|
|
74
80
|
figure of speech. Each pass through A–G is one iteration; on hitting the cap, go straight to the
|
|
75
81
|
report and list what is still unresolved rather than starting a sixth.
|
|
@@ -191,6 +197,10 @@ gh pr view <PR> --json headRefOid -q .headRefOid # must match
|
|
|
191
197
|
|
|
192
198
|
If they differ, stop: the fix is not on the PR, so nothing may be resolved yet.
|
|
193
199
|
|
|
200
|
+
Every fixed Codex thread must be replied to and resolved after this push is verified. A fix is not
|
|
201
|
+
complete while its thread remains unresolved. If no code changed, rebutted threads can be replied
|
|
202
|
+
to and resolved without a push.
|
|
203
|
+
|
|
194
204
|
### F. Reply to and resolve every addressed thread
|
|
195
205
|
|
|
196
206
|
Only now, with the fixes pushed, reply and resolve. Fetch unresolved threads, **following
|
|
@@ -227,7 +237,10 @@ gh api graphql -f query='mutation { resolveReviewThread(input: {threadId: "THREA
|
|
|
227
237
|
```
|
|
228
238
|
|
|
229
239
|
Resolve a thread only for comments authored by `$BOT` that you have fixed or rebutted: never
|
|
230
|
-
blanket-resolve, and never resolve a human reviewer's thread.
|
|
240
|
+
blanket-resolve, and never resolve a human reviewer's thread. For each fixed comment, verify the
|
|
241
|
+
push first, reply with the change made, then resolve the thread and verify `isResolved: true`.
|
|
242
|
+
For each rebutted comment, reply with the evidence and verify resolution. Do not report a comment
|
|
243
|
+
as fixed or rebutted until its thread is confirmed resolved.
|
|
231
244
|
|
|
232
245
|
Threads you are **rebutting** need no push, so they may be replied to and resolved regardless of
|
|
233
246
|
whether step D changed code.
|
|
@@ -45,7 +45,6 @@ function walk(dir, out = []) {
|
|
|
45
45
|
return out;
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
// A user-role text record that is really harness output, not something a person typed.
|
|
49
48
|
// A user-role text record that is really harness output, not something a person typed.
|
|
50
49
|
// Each alternative below was found by a run that mis-counted. The first pass caught the
|
|
51
50
|
// obvious wrappers and still let 26% through: skill body dumps, image attachments,
|
|
@@ -62,6 +61,15 @@ const HARNESS = new RegExp('^(' + [
|
|
|
62
61
|
'\\[Image #\\d+\\]', // bare attachment
|
|
63
62
|
'\\[Image: source:',
|
|
64
63
|
'\\[Pasted text',
|
|
64
|
+
// v3: the 2026-09-29 run found v2 still let 66% through, almost all of it these five.
|
|
65
|
+
'Another Claude session sent a message', // subagent / cross-session hand-back
|
|
66
|
+
'<agent-message',
|
|
67
|
+
'This session is being continued from a previous conversation', // compaction resume
|
|
68
|
+
'Stop hook feedback:',
|
|
69
|
+
'\\[SYSTEM NOTIFICATION',
|
|
70
|
+
'Your response above was cut off',
|
|
71
|
+
'\\(Re-invocation of /',
|
|
72
|
+
'\\[\\d+ prior /loop wakeup',
|
|
65
73
|
].join('|') + ')');
|
|
66
74
|
|
|
67
75
|
const textOf = (msg) => {
|
|
@@ -261,7 +269,7 @@ if (problems.length) {
|
|
|
261
269
|
console.error('INCONSISTENT REPORT, refusing to write:\n ' + problems.join('\n '));
|
|
262
270
|
process.exit(3);
|
|
263
271
|
}
|
|
264
|
-
report.echoFilterVersion =
|
|
272
|
+
report.echoFilterVersion = 3;
|
|
265
273
|
|
|
266
274
|
fs.writeFileSync(OUT, JSON.stringify(report, null, 1));
|
|
267
275
|
fs.writeFileSync(OUT.replace(/\.json$/, '') + '-turns.json', JSON.stringify(S.humanTurns, null, 1));
|
|
@@ -8,7 +8,7 @@ description: >
|
|
|
8
8
|
review", "fix codex comments", "codex loop", or wants to iterate on Codex PR review feedback.
|
|
9
9
|
compatibility: GitHub only (Codex code review is a GitHub app). Requires git + gh (GitHub CLI) authenticated, and the Codex / ChatGPT connector app installed on the repo with code review enabled.
|
|
10
10
|
metadata:
|
|
11
|
-
version: "1.
|
|
11
|
+
version: "1.1"
|
|
12
12
|
allowed-tools: Bash(gh:*) Bash(git:*)
|
|
13
13
|
---
|
|
14
14
|
<!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
|
|
@@ -70,6 +70,12 @@ Switch to the PR branch if not already on it. Capture `OWNER`/`REPO` (`gh repo v
|
|
|
70
70
|
|
|
71
71
|
## 2. The loop (max 5 iterations)
|
|
72
72
|
|
|
73
|
+
At the end of every invocation, post exactly one top-level PR conversation comment summarizing
|
|
74
|
+
the result, including iterations, comments fixed, comments rebutted, and anything remaining. This
|
|
75
|
+
is required even when the loop times out or reaches its iteration cap; report that state honestly.
|
|
76
|
+
End the comment with: **Useful? React with 👍 / 👎.** Do not post a separate summary comment for
|
|
77
|
+
each iteration.
|
|
78
|
+
|
|
73
79
|
Keep an explicit iteration counter and stop at 5: the cap is a real bound to enforce, not a
|
|
74
80
|
figure of speech. Each pass through A–G is one iteration; on hitting the cap, go straight to the
|
|
75
81
|
report and list what is still unresolved rather than starting a sixth.
|
|
@@ -191,6 +197,10 @@ gh pr view <PR> --json headRefOid -q .headRefOid # must match
|
|
|
191
197
|
|
|
192
198
|
If they differ, stop: the fix is not on the PR, so nothing may be resolved yet.
|
|
193
199
|
|
|
200
|
+
Every fixed Codex thread must be replied to and resolved after this push is verified. A fix is not
|
|
201
|
+
complete while its thread remains unresolved. If no code changed, rebutted threads can be replied
|
|
202
|
+
to and resolved without a push.
|
|
203
|
+
|
|
194
204
|
### F. Reply to and resolve every addressed thread
|
|
195
205
|
|
|
196
206
|
Only now, with the fixes pushed, reply and resolve. Fetch unresolved threads, **following
|
|
@@ -227,7 +237,10 @@ gh api graphql -f query='mutation { resolveReviewThread(input: {threadId: "THREA
|
|
|
227
237
|
```
|
|
228
238
|
|
|
229
239
|
Resolve a thread only for comments authored by `$BOT` that you have fixed or rebutted: never
|
|
230
|
-
blanket-resolve, and never resolve a human reviewer's thread.
|
|
240
|
+
blanket-resolve, and never resolve a human reviewer's thread. For each fixed comment, verify the
|
|
241
|
+
push first, reply with the change made, then resolve the thread and verify `isResolved: true`.
|
|
242
|
+
For each rebutted comment, reply with the evidence and verify resolution. Do not report a comment
|
|
243
|
+
as fixed or rebutted until its thread is confirmed resolved.
|
|
231
244
|
|
|
232
245
|
Threads you are **rebutting** need no push, so they may be replied to and resolved regardless of
|
|
233
246
|
whether step D changed code.
|
|
@@ -45,7 +45,6 @@ function walk(dir, out = []) {
|
|
|
45
45
|
return out;
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
// A user-role text record that is really harness output, not something a person typed.
|
|
49
48
|
// A user-role text record that is really harness output, not something a person typed.
|
|
50
49
|
// Each alternative below was found by a run that mis-counted. The first pass caught the
|
|
51
50
|
// obvious wrappers and still let 26% through: skill body dumps, image attachments,
|
|
@@ -62,6 +61,15 @@ const HARNESS = new RegExp('^(' + [
|
|
|
62
61
|
'\\[Image #\\d+\\]', // bare attachment
|
|
63
62
|
'\\[Image: source:',
|
|
64
63
|
'\\[Pasted text',
|
|
64
|
+
// v3: the 2026-09-29 run found v2 still let 66% through, almost all of it these five.
|
|
65
|
+
'Another Claude session sent a message', // subagent / cross-session hand-back
|
|
66
|
+
'<agent-message',
|
|
67
|
+
'This session is being continued from a previous conversation', // compaction resume
|
|
68
|
+
'Stop hook feedback:',
|
|
69
|
+
'\\[SYSTEM NOTIFICATION',
|
|
70
|
+
'Your response above was cut off',
|
|
71
|
+
'\\(Re-invocation of /',
|
|
72
|
+
'\\[\\d+ prior /loop wakeup',
|
|
65
73
|
].join('|') + ')');
|
|
66
74
|
|
|
67
75
|
const textOf = (msg) => {
|
|
@@ -261,7 +269,7 @@ if (problems.length) {
|
|
|
261
269
|
console.error('INCONSISTENT REPORT, refusing to write:\n ' + problems.join('\n '));
|
|
262
270
|
process.exit(3);
|
|
263
271
|
}
|
|
264
|
-
report.echoFilterVersion =
|
|
272
|
+
report.echoFilterVersion = 3;
|
|
265
273
|
|
|
266
274
|
fs.writeFileSync(OUT, JSON.stringify(report, null, 1));
|
|
267
275
|
fs.writeFileSync(OUT.replace(/\.json$/, '') + '-turns.json', JSON.stringify(S.humanTurns, null, 1));
|
|
@@ -8,7 +8,7 @@ description: >
|
|
|
8
8
|
review", "fix codex comments", "codex loop", or wants to iterate on Codex PR review feedback.
|
|
9
9
|
compatibility: GitHub only (Codex code review is a GitHub app). Requires git + gh (GitHub CLI) authenticated, and the Codex / ChatGPT connector app installed on the repo with code review enabled.
|
|
10
10
|
metadata:
|
|
11
|
-
version: "1.
|
|
11
|
+
version: "1.1"
|
|
12
12
|
allowed-tools: Bash(gh:*) Bash(git:*)
|
|
13
13
|
---
|
|
14
14
|
<!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
|
|
@@ -70,6 +70,12 @@ Switch to the PR branch if not already on it. Capture `OWNER`/`REPO` (`gh repo v
|
|
|
70
70
|
|
|
71
71
|
## 2. The loop (max 5 iterations)
|
|
72
72
|
|
|
73
|
+
At the end of every invocation, post exactly one top-level PR conversation comment summarizing
|
|
74
|
+
the result, including iterations, comments fixed, comments rebutted, and anything remaining. This
|
|
75
|
+
is required even when the loop times out or reaches its iteration cap; report that state honestly.
|
|
76
|
+
End the comment with: **Useful? React with 👍 / 👎.** Do not post a separate summary comment for
|
|
77
|
+
each iteration.
|
|
78
|
+
|
|
73
79
|
Keep an explicit iteration counter and stop at 5: the cap is a real bound to enforce, not a
|
|
74
80
|
figure of speech. Each pass through A–G is one iteration; on hitting the cap, go straight to the
|
|
75
81
|
report and list what is still unresolved rather than starting a sixth.
|
|
@@ -191,6 +197,10 @@ gh pr view <PR> --json headRefOid -q .headRefOid # must match
|
|
|
191
197
|
|
|
192
198
|
If they differ, stop: the fix is not on the PR, so nothing may be resolved yet.
|
|
193
199
|
|
|
200
|
+
Every fixed Codex thread must be replied to and resolved after this push is verified. A fix is not
|
|
201
|
+
complete while its thread remains unresolved. If no code changed, rebutted threads can be replied
|
|
202
|
+
to and resolved without a push.
|
|
203
|
+
|
|
194
204
|
### F. Reply to and resolve every addressed thread
|
|
195
205
|
|
|
196
206
|
Only now, with the fixes pushed, reply and resolve. Fetch unresolved threads, **following
|
|
@@ -227,7 +237,10 @@ gh api graphql -f query='mutation { resolveReviewThread(input: {threadId: "THREA
|
|
|
227
237
|
```
|
|
228
238
|
|
|
229
239
|
Resolve a thread only for comments authored by `$BOT` that you have fixed or rebutted: never
|
|
230
|
-
blanket-resolve, and never resolve a human reviewer's thread.
|
|
240
|
+
blanket-resolve, and never resolve a human reviewer's thread. For each fixed comment, verify the
|
|
241
|
+
push first, reply with the change made, then resolve the thread and verify `isResolved: true`.
|
|
242
|
+
For each rebutted comment, reply with the evidence and verify resolution. Do not report a comment
|
|
243
|
+
as fixed or rebutted until its thread is confirmed resolved.
|
|
231
244
|
|
|
232
245
|
Threads you are **rebutting** need no push, so they may be replied to and resolved regardless of
|
|
233
246
|
whether step D changed code.
|
|
@@ -45,7 +45,6 @@ function walk(dir, out = []) {
|
|
|
45
45
|
return out;
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
// A user-role text record that is really harness output, not something a person typed.
|
|
49
48
|
// A user-role text record that is really harness output, not something a person typed.
|
|
50
49
|
// Each alternative below was found by a run that mis-counted. The first pass caught the
|
|
51
50
|
// obvious wrappers and still let 26% through: skill body dumps, image attachments,
|
|
@@ -62,6 +61,15 @@ const HARNESS = new RegExp('^(' + [
|
|
|
62
61
|
'\\[Image #\\d+\\]', // bare attachment
|
|
63
62
|
'\\[Image: source:',
|
|
64
63
|
'\\[Pasted text',
|
|
64
|
+
// v3: the 2026-09-29 run found v2 still let 66% through, almost all of it these five.
|
|
65
|
+
'Another Claude session sent a message', // subagent / cross-session hand-back
|
|
66
|
+
'<agent-message',
|
|
67
|
+
'This session is being continued from a previous conversation', // compaction resume
|
|
68
|
+
'Stop hook feedback:',
|
|
69
|
+
'\\[SYSTEM NOTIFICATION',
|
|
70
|
+
'Your response above was cut off',
|
|
71
|
+
'\\(Re-invocation of /',
|
|
72
|
+
'\\[\\d+ prior /loop wakeup',
|
|
65
73
|
].join('|') + ')');
|
|
66
74
|
|
|
67
75
|
const textOf = (msg) => {
|
|
@@ -261,7 +269,7 @@ if (problems.length) {
|
|
|
261
269
|
console.error('INCONSISTENT REPORT, refusing to write:\n ' + problems.join('\n '));
|
|
262
270
|
process.exit(3);
|
|
263
271
|
}
|
|
264
|
-
report.echoFilterVersion =
|
|
272
|
+
report.echoFilterVersion = 3;
|
|
265
273
|
|
|
266
274
|
fs.writeFileSync(OUT, JSON.stringify(report, null, 1));
|
|
267
275
|
fs.writeFileSync(OUT.replace(/\.json$/, '') + '-turns.json', JSON.stringify(S.humanTurns, null, 1));
|
package/catalog/skills.json
CHANGED
|
@@ -144,7 +144,7 @@
|
|
|
144
144
|
},
|
|
145
145
|
{
|
|
146
146
|
"name": "codexloop",
|
|
147
|
-
"lookupName": "
|
|
147
|
+
"lookupName": "codexloop",
|
|
148
148
|
"path": "plugins/olko-github-pr/skills/codexloop",
|
|
149
149
|
"description": "Iteratively drives a GitHub PR to zero unresolved OpenAI Codex review comments, verifying every finding against the real code first, fixes only the correct ones, and rebuts false positives without changing correct code.",
|
|
150
150
|
"tags": [
|
package/package.json
CHANGED
|
@@ -8,7 +8,7 @@ description: >
|
|
|
8
8
|
review", "fix codex comments", "codex loop", or wants to iterate on Codex PR review feedback.
|
|
9
9
|
compatibility: GitHub only (Codex code review is a GitHub app). Requires git + gh (GitHub CLI) authenticated, and the Codex / ChatGPT connector app installed on the repo with code review enabled.
|
|
10
10
|
metadata:
|
|
11
|
-
version: "1.
|
|
11
|
+
version: "1.1"
|
|
12
12
|
allowed-tools: Bash(gh:*) Bash(git:*)
|
|
13
13
|
---
|
|
14
14
|
|
|
@@ -69,6 +69,12 @@ Switch to the PR branch if not already on it. Capture `OWNER`/`REPO` (`gh repo v
|
|
|
69
69
|
|
|
70
70
|
## 2. The loop (max 5 iterations)
|
|
71
71
|
|
|
72
|
+
At the end of every invocation, post exactly one top-level PR conversation comment summarizing
|
|
73
|
+
the result, including iterations, comments fixed, comments rebutted, and anything remaining. This
|
|
74
|
+
is required even when the loop times out or reaches its iteration cap; report that state honestly.
|
|
75
|
+
End the comment with: **Useful? React with 👍 / 👎.** Do not post a separate summary comment for
|
|
76
|
+
each iteration.
|
|
77
|
+
|
|
72
78
|
Keep an explicit iteration counter and stop at 5: the cap is a real bound to enforce, not a
|
|
73
79
|
figure of speech. Each pass through A–G is one iteration; on hitting the cap, go straight to the
|
|
74
80
|
report and list what is still unresolved rather than starting a sixth.
|
|
@@ -190,6 +196,10 @@ gh pr view <PR> --json headRefOid -q .headRefOid # must match
|
|
|
190
196
|
|
|
191
197
|
If they differ, stop: the fix is not on the PR, so nothing may be resolved yet.
|
|
192
198
|
|
|
199
|
+
Every fixed Codex thread must be replied to and resolved after this push is verified. A fix is not
|
|
200
|
+
complete while its thread remains unresolved. If no code changed, rebutted threads can be replied
|
|
201
|
+
to and resolved without a push.
|
|
202
|
+
|
|
193
203
|
### F. Reply to and resolve every addressed thread
|
|
194
204
|
|
|
195
205
|
Only now, with the fixes pushed, reply and resolve. Fetch unresolved threads, **following
|
|
@@ -226,7 +236,10 @@ gh api graphql -f query='mutation { resolveReviewThread(input: {threadId: "THREA
|
|
|
226
236
|
```
|
|
227
237
|
|
|
228
238
|
Resolve a thread only for comments authored by `$BOT` that you have fixed or rebutted: never
|
|
229
|
-
blanket-resolve, and never resolve a human reviewer's thread.
|
|
239
|
+
blanket-resolve, and never resolve a human reviewer's thread. For each fixed comment, verify the
|
|
240
|
+
push first, reply with the change made, then resolve the thread and verify `isResolved: true`.
|
|
241
|
+
For each rebutted comment, reply with the evidence and verify resolution. Do not report a comment
|
|
242
|
+
as fixed or rebutted until its thread is confirmed resolved.
|
|
230
243
|
|
|
231
244
|
Threads you are **rebutting** need no push, so they may be replied to and resolved regardless of
|
|
232
245
|
whether step D changed code.
|
|
@@ -45,7 +45,6 @@ function walk(dir, out = []) {
|
|
|
45
45
|
return out;
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
// A user-role text record that is really harness output, not something a person typed.
|
|
49
48
|
// A user-role text record that is really harness output, not something a person typed.
|
|
50
49
|
// Each alternative below was found by a run that mis-counted. The first pass caught the
|
|
51
50
|
// obvious wrappers and still let 26% through: skill body dumps, image attachments,
|
|
@@ -62,6 +61,15 @@ const HARNESS = new RegExp('^(' + [
|
|
|
62
61
|
'\\[Image #\\d+\\]', // bare attachment
|
|
63
62
|
'\\[Image: source:',
|
|
64
63
|
'\\[Pasted text',
|
|
64
|
+
// v3: the 2026-09-29 run found v2 still let 66% through, almost all of it these five.
|
|
65
|
+
'Another Claude session sent a message', // subagent / cross-session hand-back
|
|
66
|
+
'<agent-message',
|
|
67
|
+
'This session is being continued from a previous conversation', // compaction resume
|
|
68
|
+
'Stop hook feedback:',
|
|
69
|
+
'\\[SYSTEM NOTIFICATION',
|
|
70
|
+
'Your response above was cut off',
|
|
71
|
+
'\\(Re-invocation of /',
|
|
72
|
+
'\\[\\d+ prior /loop wakeup',
|
|
65
73
|
].join('|') + ')');
|
|
66
74
|
|
|
67
75
|
const textOf = (msg) => {
|
|
@@ -261,7 +269,7 @@ if (problems.length) {
|
|
|
261
269
|
console.error('INCONSISTENT REPORT, refusing to write:\n ' + problems.join('\n '));
|
|
262
270
|
process.exit(3);
|
|
263
271
|
}
|
|
264
|
-
report.echoFilterVersion =
|
|
272
|
+
report.echoFilterVersion = 3;
|
|
265
273
|
|
|
266
274
|
fs.writeFileSync(OUT, JSON.stringify(report, null, 1));
|
|
267
275
|
fs.writeFileSync(OUT.replace(/\.json$/, '') + '-turns.json', JSON.stringify(S.humanTurns, null, 1));
|
package/site/build.mjs
CHANGED
|
@@ -19,6 +19,8 @@ const out = join(root, "_site");
|
|
|
19
19
|
|
|
20
20
|
const SITE_URL = "https://skills.olegkoval.com";
|
|
21
21
|
const PORTFOLIO = "https://www.olegkoval.com";
|
|
22
|
+
const FACTORY_URL = "https://factory.olegkoval.com/";
|
|
23
|
+
const FACTORY_CASE_STUDY_URL = `${FACTORY_URL}case-studies/development-hydration-warning/`;
|
|
22
24
|
const REPO = "https://github.com/oleg-koval/agent-skills";
|
|
23
25
|
const CNAME = "skills.olegkoval.com";
|
|
24
26
|
const GA_MEASUREMENT_ID = "G-NV8Q2H8YV0";
|
|
@@ -287,6 +289,7 @@ ${installSection(packages[0].lookupName)}
|
|
|
287
289
|
<p>Every workflow has one canonical skill package. Tool-specific adapters are generated from it, so the marketplace, source files, and this site stay aligned.</p>
|
|
288
290
|
</div>
|
|
289
291
|
<a class="quiet-link" href="${PORTFOLIO}" data-analytics-event="portfolio_visit" data-analytics-location="about">More open-source work and writing at olegkoval.com <span aria-hidden="true">↗</span></a>
|
|
292
|
+
<p>For proof-oriented coding-agent delivery, explore <a href="${FACTORY_URL}">Factory</a>, Oleg's separate MIT-licensed skill for Claude Code and Codex. <a href="${FACTORY_CASE_STUDY_URL}">Inspect a full documented run</a>.</p>
|
|
290
293
|
</section>`;
|
|
291
294
|
|
|
292
295
|
return layout({
|