@olegkoval/agent-skills 1.23.0 → 1.25.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.
Files changed (34) hide show
  1. package/.claude-plugin/plugin.json +2 -1
  2. package/.cursor-plugin/index.json +5 -0
  3. package/.grok-plugin/index.json +5 -0
  4. package/.kiro/steering/garmin-watchface.md +7 -0
  5. package/.kiro/steering/pr-finalize.md +140 -0
  6. package/.windsurf/rules/garmin-watchface.md +7 -0
  7. package/.windsurf/rules/pr-finalize.md +139 -0
  8. package/README.md +1 -0
  9. package/catalog/skills.json +30 -6
  10. package/package.json +1 -1
  11. package/packages/software-development/pr-finalize/SKILL.md +149 -0
  12. package/packages/software-development/pr-finalize/adapters/claude/plugin.json +5 -0
  13. package/packages/software-development/pr-finalize/adapters/claude/skills/pr-finalize/SKILL.md +150 -0
  14. package/packages/software-development/pr-finalize/adapters/codex/README.md +26 -0
  15. package/packages/software-development/pr-finalize/adapters/cursor/plugin.json +6 -0
  16. package/packages/software-development/pr-finalize/adapters/cursor/skills/pr-finalize/SKILL.md +151 -0
  17. package/packages/software-development/pr-finalize/adapters/grok/plugin.json +6 -0
  18. package/packages/software-development/pr-finalize/adapters/grok/skills/pr-finalize/SKILL.md +150 -0
  19. package/packages/software-development/pr-finalize/adapters/kiro/steering/pr-finalize.md +140 -0
  20. package/packages/software-development/pr-finalize/adapters/windsurf/rules/pr-finalize.md +139 -0
  21. package/packages/wearables/garmin-watchface/SKILL.md +7 -0
  22. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/SKILL.md +7 -0
  23. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/references/publishing.md +145 -0
  24. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/scripts/ciq-release +333 -0
  25. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/SKILL.md +7 -0
  26. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/references/publishing.md +145 -0
  27. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/scripts/ciq-release +333 -0
  28. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/SKILL.md +7 -0
  29. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/references/publishing.md +145 -0
  30. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/scripts/ciq-release +333 -0
  31. package/packages/wearables/garmin-watchface/adapters/kiro/steering/garmin-watchface.md +7 -0
  32. package/packages/wearables/garmin-watchface/adapters/windsurf/rules/garmin-watchface.md +7 -0
  33. package/packages/wearables/garmin-watchface/references/publishing.md +145 -0
  34. package/packages/wearables/garmin-watchface/scripts/ciq-release +333 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-agent-skills",
3
3
  "description": "Agent-agnostic skill catalog for Codex, Claude, Cursor, Grok, Copilot, Windsurf, Kiro, and other skill-aware tools.",
4
- "version": "1.22.0",
4
+ "version": "1.24.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -32,6 +32,7 @@
32
32
  "./packages/software-development/macos-menubar-app",
33
33
  "./packages/software-development/skill-budget-audit",
34
34
  "./packages/software-development/crash-course",
35
+ "./packages/software-development/pr-finalize",
35
36
  "./packages/software-development/qodoloop",
36
37
  "./packages/wearables/garmin-watchface",
37
38
  "./packages/software-development/coderabbitloop",
@@ -106,6 +106,11 @@
106
106
  "source": "./packages/software-development/crash-course/adapters/cursor",
107
107
  "description": "Expert tutor for rapid, source-grounded learning of any topic: a timed 4-hour sprint plus cheat-sheet, learning-ladder, quiz-me, Feynman, and resource-curation modes."
108
108
  },
109
+ {
110
+ "name": "olko:pr-finalize",
111
+ "source": "./packages/software-development/pr-finalize/adapters/cursor",
112
+ "description": "Drives one GitHub PR to genuinely merge-ready: rebases and resolves conflicts, sweeps every review bot and human comment to zero unaddressed findings, verifies unit and E2E coverage actually exists, runs the repo's real lint/format/test gates before pushing, and reports what still needs a human."
113
+ },
109
114
  {
110
115
  "name": "olko:qodoloop",
111
116
  "source": "./packages/software-development/qodoloop/adapters/cursor",
@@ -116,6 +116,11 @@
116
116
  "source": "./packages/software-development/crash-course/adapters/grok",
117
117
  "description": "Expert tutor for rapid, source-grounded learning of any topic: a timed 4-hour sprint plus cheat-sheet, learning-ladder, quiz-me, Feynman, and resource-curation modes."
118
118
  },
119
+ {
120
+ "name": "olko:pr-finalize",
121
+ "source": "./packages/software-development/pr-finalize/adapters/grok",
122
+ "description": "Drives one GitHub PR to genuinely merge-ready: rebases and resolves conflicts, sweeps every review bot and human comment to zero unaddressed findings, verifies unit and E2E coverage actually exists, runs the repo's real lint/format/test gates before pushing, and reports what still needs a human."
123
+ },
119
124
  {
120
125
  "name": "olko:qodoloop",
121
126
  "source": "./packages/software-development/qodoloop/adapters/grok",
@@ -22,6 +22,7 @@ looked like success first.
22
22
  | `references/simulator.md` | Screenshots, settings not applying, monkeydo hanging |
23
23
  | `references/devices.md` | Adding device support, launcher icons, API levels |
24
24
  | `references/store.md` | Publishing, listing copy, IP questions |
25
+ | `references/publishing.md` | Driving the store portal in a browser; upload/update flow, validator rejections |
25
26
 
26
27
  ## Tools
27
28
 
@@ -34,8 +35,14 @@ Run these rather than reinventing them. All are standalone.
34
35
  <skill-dir>/scripts/ciq-capture out.png # calibrated simulator screenshot
35
36
  <skill-dir>/scripts/ciq-capture out.png --face --size 260 # cropped + masked to the round display
36
37
  <skill-dir>/scripts/ciq-calibrate # re-derive the display rect if capture looks wrong
38
+ <skill-dir>/scripts/ciq-release # pre-submission check: package, screenshots, icon, keys, copy
37
39
  ```
38
40
 
41
+ `<skill-dir>/scripts/ciq-release` is what you run before opening the store
42
+ portal. Every check in it is something otherwise discovered halfway through the
43
+ submission form -- a stale screenshot set, an icon still copied from the last
44
+ project, or copy containing a character the description validator rejects.
45
+
39
46
  `<skill-dir>/scripts/ciq-capture` exists because `screencapture -R` grabs a screen *region*, not
40
47
  a window: without a frontmost check it silently photographs whatever is on top,
41
48
  and the window moves between simulator restarts. Both failure modes produce a
@@ -0,0 +1,140 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ ---
4
+ inclusion: manual
5
+ description: "Drives one GitHub PR to genuinely merge-ready: rebases and resolves conflicts, sweeps every review bot and human comment to zero unaddressed findings, verifies unit and E2E coverage actually exists, runs the repo's real lint/format/test gates before pushing, and reports what still needs a human."
6
+ ---
7
+
8
+ # PR Finalize
9
+
10
+ One PR, taken all the way to merge-ready. The job is not "make the bots stop talking" — it is **land the change in a state a careful reviewer would sign off on**, with evidence for every claim.
11
+
12
+ ## Inputs
13
+
14
+ - **PR number or URL** (optional): detect from the current branch if not given.
15
+ - `--no-push` (optional): do everything except the final push. Use when the repo auto-merges and the user wants to eyeball first.
16
+
17
+ ## Non-negotiables
18
+
19
+ These are the failure modes this skill exists to prevent. Violating one makes the whole run worthless:
20
+
21
+ - **Never report a gate as passing without having run it.** Paste the real output. "Tests should pass" is not a result.
22
+ - **Never resolve or claim-fix a finding you didn't actually fix.** Blocked is an honest outcome; a false "done" is not.
23
+ - **Never `git add -A`.** Stage only the files your fixes touched. Start from a clean tree so that's safe.
24
+ - **Never invent test coverage.** If the change has no browser-reachable surface, say so explicitly and name the suite that *is* the real gate. Do not add a hollow E2E test to look thorough.
25
+ - **A green CI badge is not proof.** Many repos split their required check from the full suite (browser-free half only, etc.). Find out what the required check actually runs.
26
+
27
+ ## Instructions
28
+
29
+ ### 1. Establish the ground truth
30
+
31
+ ```bash
32
+ gh pr view <PR> --json number,title,body,state,isDraft,headRefName,baseRefName,mergeable,mergeStateStatus,labels,reviewDecision,statusCheckRollup,url
33
+ ```
34
+
35
+ Record four things before touching code:
36
+
37
+ - **`mergeable`** — `CONFLICTING` means step 2 is mandatory.
38
+ - **Which checks are failing**, and for each, whether it is *required*. Check branch protection (`gh api repos/{owner}/{repo}/branches/<base>/protection`) rather than assuming — a red optional job (a flaky bot-review runner, a nightly) is not a blocker, and burning the run waiting on one is a classic waste.
39
+ - **Whether the repo auto-merges.** Look for a shepherd/automerge workflow in `.github/workflows/` and read its *gating conditions* (required labels, required checks). If pushing could trigger an immediate merge, decide deliberately: either satisfy the review sweep first, or tell the user before you push. Never let an auto-merge race a review you were asked to complete.
40
+ - **Whether a bot review actually ran.** A `SUCCESS` status from a review bot can still mean "rate-limited, never reviewed" — read its comment body, not just the check state.
41
+
42
+ ### 2. Rebase onto the base branch
43
+
44
+ Require a clean tree first (`git status --porcelain` empty), then:
45
+
46
+ ```bash
47
+ git fetch origin <base>
48
+ git rebase origin/<base>
49
+ ```
50
+
51
+ Resolve conflicts by **understanding both sides**, not by picking one. Read the base-side commit that introduced the conflicting hunk (`git log -1 --format=%s <base> -- <file>`, then the diff) — a conflict usually means main changed an invariant your branch is unaware of, and blindly keeping "your" side silently reverts it. State in the PR comment which invariant you preserved and why.
52
+
53
+ After resolving, re-run the tests before continuing — a rebase that compiles is not a rebase that works.
54
+
55
+ ### 3. Sweep every review source
56
+
57
+ Collect findings from all of these; do not stop at the first:
58
+
59
+ ```bash
60
+ # inline review threads (all bots + humans), with resolution state
61
+ gh api repos/{owner}/{repo}/pulls/<PR>/comments --paginate
62
+ # rollup issue comments (where CodeRabbit/Qodo post summaries and rate-limit notices)
63
+ gh api repos/{owner}/{repo}/issues/<PR>/comments --paginate
64
+ # formal reviews
65
+ gh pr view <PR> --json reviews
66
+ ```
67
+
68
+ **Delegate to the dedicated loop skill when one exists** rather than reimplementing its bot's protocol — `qodoloop` for Qodo, `coderabbitloop` for CodeRabbit, `greploop` for Greptile. Each already encodes that bot's posting shape, its ready-made per-finding fix prompt, and its real terminal states. Use this skill's own sweep for human comments and for bots without a dedicated loop.
69
+
70
+ Triage every finding into exactly one bucket:
71
+
72
+ | Bucket | Action |
73
+ |---|---|
74
+ | **Real defect** | Fix it. This is the point of the exercise. |
75
+ | **Legitimate improvement** | Fix it if it's in scope for this PR. |
76
+ | **False positive** | Reply explaining *specifically* why the bot is wrong. Do not resolve silently. |
77
+ | **Needs a human call** | Reply, leave open, surface in the final report. |
78
+
79
+ Bot findings are suggestions from something that has not run the code. A "🐞 Bug" label is a hypothesis — verify it against the actual source before fixing, and against the actual behavior before dismissing.
80
+
81
+ ### 4. Close the coverage gap
82
+
83
+ Ask, for the change as a whole, what would catch a regression here — then check whether the PR actually has it.
84
+
85
+ - **Unit / integration tests:** does every new branch have a test that fails if you invert it? Bots frequently and correctly flag helper functions exercised only *indirectly* through a caller. A direct test per branch is cheap and is usually the right response.
86
+ - **Browser / E2E tests:** determine whether the repo supports them (`playwright.config.*`, `cypress.config.*`, a `test:e2e` script) **and** whether this change has any surface they can reach. Then do one of exactly two things:
87
+ - it has a reachable surface → add or extend the E2E spec;
88
+ - it does not → **say so explicitly in the PR comment**, name why (e.g. "this is entirely inside a Durable Object alarm loop; the E2E harness only serves static assets"), and name the suite that is the real gate.
89
+
90
+ Silence here reads as an oversight. An explicit "not applicable, because X" reads as diligence — and is checkable.
91
+
92
+ ### 5. Run the real gates
93
+
94
+ Discover them from the repo (`Makefile`, `package.json` scripts, CI workflow) — do not guess target names. Run, at minimum, the equivalents of:
95
+
96
+ ```bash
97
+ <lint> # e.g. make lint / npm run lint
98
+ <format> # check mode first; only write if it reports drift
99
+ <tests> # the suite covering the changed package
100
+ ```
101
+
102
+ Capture exit codes, not just output. Repo-specific traps worth checking for before you burn a cycle: linters whose cache replays findings from deleted sibling worktrees, formatters whose local toolchain version outruns CI's (churning unrelated files), and test runners that hang when two runs overlap.
103
+
104
+ If a gate fails, fix it. Do not push red.
105
+
106
+ ### 6. Push and explain
107
+
108
+ Stage only the files you touched, commit, and push (`--force-with-lease` after a rebase — never bare `--force`).
109
+
110
+ Then post **one** PR comment that a reviewer can audit without re-reading the diff:
111
+
112
+ - what the rebase conflict was and which side won, with the reason;
113
+ - each finding, and what you did about it (including the ones you rejected, with the argument);
114
+ - the coverage decision from step 4, including the explicit not-applicable if that's the answer;
115
+ - **verbatim** gate output — real numbers (`# pass 480 / # fail 0`, `0 issues.`), not adjectives.
116
+
117
+ Re-trigger any bot that never actually reviewed (e.g. `@coderabbitai review`) so the PR gets the pass it was owed.
118
+
119
+ ### 7. Verify and report
120
+
121
+ Re-read the PR state after the push — confirm `mergeable` flipped, checks went green, and clear now-stale labels (`needs-rebase`, etc.). Poll re-triggered bots for their new pass and handle anything it raises.
122
+
123
+ ```text
124
+ PR #965 finalized.
125
+ Rebase: 1 conflict resolved (kept main's #834 D1-first ordering)
126
+ Findings: 2 addressed, 0 rejected, 0 blocked
127
+ Coverage: +5 unit tests; E2E not applicable (no browser surface) — stated on the PR
128
+ Gates: tests 480/480, lint 0 issues, format clean
129
+ State: MERGEABLE, checks green
130
+ Needs human: none
131
+ ```
132
+
133
+ If anything is left, say precisely what and why — an honest "blocked on X" is the deliverable when X is genuinely a human call.
134
+
135
+ ## Related skills
136
+
137
+ - `qodoloop` — full Qodo thread protocol (per-finding Agent Prompts, resolve mutations).
138
+ - `coderabbitloop` — full CodeRabbit protocol.
139
+ - `greploop` — drives a PR to a 5/5 Greptile confidence score.
140
+ - `ci-fix-loop` — when the blocker is a failing pipeline rather than review feedback.
@@ -21,6 +21,7 @@ looked like success first.
21
21
  | `references/simulator.md` | Screenshots, settings not applying, monkeydo hanging |
22
22
  | `references/devices.md` | Adding device support, launcher icons, API levels |
23
23
  | `references/store.md` | Publishing, listing copy, IP questions |
24
+ | `references/publishing.md` | Driving the store portal in a browser; upload/update flow, validator rejections |
24
25
 
25
26
  ## Tools
26
27
 
@@ -33,8 +34,14 @@ Run these rather than reinventing them. All are standalone.
33
34
  <skill-dir>/scripts/ciq-capture out.png # calibrated simulator screenshot
34
35
  <skill-dir>/scripts/ciq-capture out.png --face --size 260 # cropped + masked to the round display
35
36
  <skill-dir>/scripts/ciq-calibrate # re-derive the display rect if capture looks wrong
37
+ <skill-dir>/scripts/ciq-release # pre-submission check: package, screenshots, icon, keys, copy
36
38
  ```
37
39
 
40
+ `<skill-dir>/scripts/ciq-release` is what you run before opening the store
41
+ portal. Every check in it is something otherwise discovered halfway through the
42
+ submission form -- a stale screenshot set, an icon still copied from the last
43
+ project, or copy containing a character the description validator rejects.
44
+
38
45
  `<skill-dir>/scripts/ciq-capture` exists because `screencapture -R` grabs a screen *region*, not
39
46
  a window: without a frontmost check it silently photographs whatever is on top,
40
47
  and the window moves between simulator restarts. Both failure modes produce a
@@ -0,0 +1,139 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ ---
4
+ description: "Drives one GitHub PR to genuinely merge-ready: rebases and resolves conflicts, sweeps every review bot and human comment to zero unaddressed findings, verifies unit and E2E coverage actually exists, runs the repo's real lint/format/test gates before pushing, and reports what still needs a human."
5
+ ---
6
+
7
+ # PR Finalize
8
+
9
+ One PR, taken all the way to merge-ready. The job is not "make the bots stop talking" — it is **land the change in a state a careful reviewer would sign off on**, with evidence for every claim.
10
+
11
+ ## Inputs
12
+
13
+ - **PR number or URL** (optional): detect from the current branch if not given.
14
+ - `--no-push` (optional): do everything except the final push. Use when the repo auto-merges and the user wants to eyeball first.
15
+
16
+ ## Non-negotiables
17
+
18
+ These are the failure modes this skill exists to prevent. Violating one makes the whole run worthless:
19
+
20
+ - **Never report a gate as passing without having run it.** Paste the real output. "Tests should pass" is not a result.
21
+ - **Never resolve or claim-fix a finding you didn't actually fix.** Blocked is an honest outcome; a false "done" is not.
22
+ - **Never `git add -A`.** Stage only the files your fixes touched. Start from a clean tree so that's safe.
23
+ - **Never invent test coverage.** If the change has no browser-reachable surface, say so explicitly and name the suite that *is* the real gate. Do not add a hollow E2E test to look thorough.
24
+ - **A green CI badge is not proof.** Many repos split their required check from the full suite (browser-free half only, etc.). Find out what the required check actually runs.
25
+
26
+ ## Instructions
27
+
28
+ ### 1. Establish the ground truth
29
+
30
+ ```bash
31
+ gh pr view <PR> --json number,title,body,state,isDraft,headRefName,baseRefName,mergeable,mergeStateStatus,labels,reviewDecision,statusCheckRollup,url
32
+ ```
33
+
34
+ Record four things before touching code:
35
+
36
+ - **`mergeable`** — `CONFLICTING` means step 2 is mandatory.
37
+ - **Which checks are failing**, and for each, whether it is *required*. Check branch protection (`gh api repos/{owner}/{repo}/branches/<base>/protection`) rather than assuming — a red optional job (a flaky bot-review runner, a nightly) is not a blocker, and burning the run waiting on one is a classic waste.
38
+ - **Whether the repo auto-merges.** Look for a shepherd/automerge workflow in `.github/workflows/` and read its *gating conditions* (required labels, required checks). If pushing could trigger an immediate merge, decide deliberately: either satisfy the review sweep first, or tell the user before you push. Never let an auto-merge race a review you were asked to complete.
39
+ - **Whether a bot review actually ran.** A `SUCCESS` status from a review bot can still mean "rate-limited, never reviewed" — read its comment body, not just the check state.
40
+
41
+ ### 2. Rebase onto the base branch
42
+
43
+ Require a clean tree first (`git status --porcelain` empty), then:
44
+
45
+ ```bash
46
+ git fetch origin <base>
47
+ git rebase origin/<base>
48
+ ```
49
+
50
+ Resolve conflicts by **understanding both sides**, not by picking one. Read the base-side commit that introduced the conflicting hunk (`git log -1 --format=%s <base> -- <file>`, then the diff) — a conflict usually means main changed an invariant your branch is unaware of, and blindly keeping "your" side silently reverts it. State in the PR comment which invariant you preserved and why.
51
+
52
+ After resolving, re-run the tests before continuing — a rebase that compiles is not a rebase that works.
53
+
54
+ ### 3. Sweep every review source
55
+
56
+ Collect findings from all of these; do not stop at the first:
57
+
58
+ ```bash
59
+ # inline review threads (all bots + humans), with resolution state
60
+ gh api repos/{owner}/{repo}/pulls/<PR>/comments --paginate
61
+ # rollup issue comments (where CodeRabbit/Qodo post summaries and rate-limit notices)
62
+ gh api repos/{owner}/{repo}/issues/<PR>/comments --paginate
63
+ # formal reviews
64
+ gh pr view <PR> --json reviews
65
+ ```
66
+
67
+ **Delegate to the dedicated loop skill when one exists** rather than reimplementing its bot's protocol — `qodoloop` for Qodo, `coderabbitloop` for CodeRabbit, `greploop` for Greptile. Each already encodes that bot's posting shape, its ready-made per-finding fix prompt, and its real terminal states. Use this skill's own sweep for human comments and for bots without a dedicated loop.
68
+
69
+ Triage every finding into exactly one bucket:
70
+
71
+ | Bucket | Action |
72
+ |---|---|
73
+ | **Real defect** | Fix it. This is the point of the exercise. |
74
+ | **Legitimate improvement** | Fix it if it's in scope for this PR. |
75
+ | **False positive** | Reply explaining *specifically* why the bot is wrong. Do not resolve silently. |
76
+ | **Needs a human call** | Reply, leave open, surface in the final report. |
77
+
78
+ Bot findings are suggestions from something that has not run the code. A "🐞 Bug" label is a hypothesis — verify it against the actual source before fixing, and against the actual behavior before dismissing.
79
+
80
+ ### 4. Close the coverage gap
81
+
82
+ Ask, for the change as a whole, what would catch a regression here — then check whether the PR actually has it.
83
+
84
+ - **Unit / integration tests:** does every new branch have a test that fails if you invert it? Bots frequently and correctly flag helper functions exercised only *indirectly* through a caller. A direct test per branch is cheap and is usually the right response.
85
+ - **Browser / E2E tests:** determine whether the repo supports them (`playwright.config.*`, `cypress.config.*`, a `test:e2e` script) **and** whether this change has any surface they can reach. Then do one of exactly two things:
86
+ - it has a reachable surface → add or extend the E2E spec;
87
+ - it does not → **say so explicitly in the PR comment**, name why (e.g. "this is entirely inside a Durable Object alarm loop; the E2E harness only serves static assets"), and name the suite that is the real gate.
88
+
89
+ Silence here reads as an oversight. An explicit "not applicable, because X" reads as diligence — and is checkable.
90
+
91
+ ### 5. Run the real gates
92
+
93
+ Discover them from the repo (`Makefile`, `package.json` scripts, CI workflow) — do not guess target names. Run, at minimum, the equivalents of:
94
+
95
+ ```bash
96
+ <lint> # e.g. make lint / npm run lint
97
+ <format> # check mode first; only write if it reports drift
98
+ <tests> # the suite covering the changed package
99
+ ```
100
+
101
+ Capture exit codes, not just output. Repo-specific traps worth checking for before you burn a cycle: linters whose cache replays findings from deleted sibling worktrees, formatters whose local toolchain version outruns CI's (churning unrelated files), and test runners that hang when two runs overlap.
102
+
103
+ If a gate fails, fix it. Do not push red.
104
+
105
+ ### 6. Push and explain
106
+
107
+ Stage only the files you touched, commit, and push (`--force-with-lease` after a rebase — never bare `--force`).
108
+
109
+ Then post **one** PR comment that a reviewer can audit without re-reading the diff:
110
+
111
+ - what the rebase conflict was and which side won, with the reason;
112
+ - each finding, and what you did about it (including the ones you rejected, with the argument);
113
+ - the coverage decision from step 4, including the explicit not-applicable if that's the answer;
114
+ - **verbatim** gate output — real numbers (`# pass 480 / # fail 0`, `0 issues.`), not adjectives.
115
+
116
+ Re-trigger any bot that never actually reviewed (e.g. `@coderabbitai review`) so the PR gets the pass it was owed.
117
+
118
+ ### 7. Verify and report
119
+
120
+ Re-read the PR state after the push — confirm `mergeable` flipped, checks went green, and clear now-stale labels (`needs-rebase`, etc.). Poll re-triggered bots for their new pass and handle anything it raises.
121
+
122
+ ```text
123
+ PR #965 finalized.
124
+ Rebase: 1 conflict resolved (kept main's #834 D1-first ordering)
125
+ Findings: 2 addressed, 0 rejected, 0 blocked
126
+ Coverage: +5 unit tests; E2E not applicable (no browser surface) — stated on the PR
127
+ Gates: tests 480/480, lint 0 issues, format clean
128
+ State: MERGEABLE, checks green
129
+ Needs human: none
130
+ ```
131
+
132
+ If anything is left, say precisely what and why — an honest "blocked on X" is the deliverable when X is genuinely a human call.
133
+
134
+ ## Related skills
135
+
136
+ - `qodoloop` — full Qodo thread protocol (per-finding Agent Prompts, resolve mutations).
137
+ - `coderabbitloop` — full CodeRabbit protocol.
138
+ - `greploop` — drives a PR to a 5/5 Greptile confidence score.
139
+ - `ci-fix-loop` — when the blocker is a failing pipeline rather than review feedback.
package/README.md CHANGED
@@ -162,6 +162,7 @@ Each entry links to its `SKILL.md`. Reference any skill by its `olko:*` lookup n
162
162
  | [open-source-publisher](packages/software-development/open-source-publisher/SKILL.md) | Prepares an open-source repository for public publishing with branding, CI/CD, and release hygiene | Releasing a private project publicly with proper GitHub Pages, README, and social preview |
163
163
  | [product-builder](packages/software-development/product-builder/SKILL.md) | Builds a full-stack web app or SaaS product from a user description using production-oriented defaults | Building a complete app, SaaS, dashboard, or product rather than a prototype |
164
164
  | [pr-description-writer](packages/software-development/pr-description-writer/SKILL.md) | Drafts and posts a GitHub PR title and body from git diff and commit history, respecting existing PR templates | Opening a PR after pushing a branch or wanting a structured PR description written automatically |
165
+ | [pr-finalize](packages/software-development/pr-finalize/SKILL.md) | Drives one GitHub PR to genuinely merge-ready: rebases and resolves conflicts, sweeps every review bot and human comment, verifies unit and E2E coverage really exists, and runs the repo's own lint/format/test gates before pushing | Finalizing a PR, clearing all outstanding review comments, or getting a branch merge-ready in one pass |
165
166
  | [promptctl](packages/software-development/promptctl/SKILL.md) | Uses `promptctl` for reusable prompt templates, scoring, and workflow automation | A project needs prompt conventions, review, scoring, or reusable prompt workflows |
166
167
  | [qodoloop](packages/software-development/qodoloop/SKILL.md) | Iteratively drives a GitHub PR to zero unresolved Qodo findings, reading each finding's own Agent Prompt, replying to the thread, and resolving it | Fully addressing a PR against Qodo's code review before merging |
167
168
  | [relay](packages/software-development/relay/SKILL.md) | Uses `claude-relay` to run long or rate-limit-prone tasks autonomously across subscription accounts | A task will outlive one session or hit rate limits partway through |
@@ -399,7 +399,7 @@
399
399
  "lookupName": "olko:obsidian-pr-sync",
400
400
  "category": "software-development",
401
401
  "path": "packages/software-development/obsidian-pr-sync",
402
- "description": "Fetch open GitHub PRs assigned to you or requesting your review, and write a grouped, age-sorted '## PRs to review' section into today's Obsidian daily note. Idempotent \u2014 re-running replaces the section.",
402
+ "description": "Fetch open GitHub PRs assigned to you or requesting your review, and write a grouped, age-sorted '## PRs to review' section into today's Obsidian daily note. Idempotent re-running replaces the section.",
403
403
  "tags": [
404
404
  "github",
405
405
  "obsidian",
@@ -470,7 +470,7 @@
470
470
  "lookupName": "olko:macos-menubar-app",
471
471
  "category": "software-development",
472
472
  "path": "packages/software-development/macos-menubar-app",
473
- "description": "Build a production-quality macOS menubar or notch app in SwiftUI \u2014 MenuBarExtra, sandbox entitlements, keyboard shortcuts, sound effects, accessibility permissions, and App Store preparation.",
473
+ "description": "Build a production-quality macOS menubar or notch app in SwiftUI MenuBarExtra, sandbox entitlements, keyboard shortcuts, sound effects, accessibility permissions, and App Store preparation.",
474
474
  "tags": [
475
475
  "macos",
476
476
  "swiftui",
@@ -495,7 +495,7 @@
495
495
  "lookupName": "olko:skill-budget-audit",
496
496
  "category": "software-development",
497
497
  "path": "packages/software-development/skill-budget-audit",
498
- "description": "Diagnose and fix Claude Code skill context budget overflow \u2014 identify heavy plugin bundles, remove domain-specific ones, and restore skill discoverability.",
498
+ "description": "Diagnose and fix Claude Code skill context budget overflow identify heavy plugin bundles, remove domain-specific ones, and restore skill discoverability.",
499
499
  "tags": [
500
500
  "claude-code",
501
501
  "skills",
@@ -533,12 +533,36 @@
533
533
  "grok"
534
534
  ]
535
535
  },
536
+ {
537
+ "name": "pr-finalize",
538
+ "lookupName": "olko:pr-finalize",
539
+ "category": "software-development",
540
+ "path": "packages/software-development/pr-finalize",
541
+ "description": "Drives one GitHub PR to genuinely merge-ready: rebases and resolves conflicts, sweeps every review bot and human comment to zero unaddressed findings, verifies unit and E2E coverage actually exists, runs the repo's real lint/format/test gates before pushing, and reports what still needs a human.",
542
+ "tags": [
543
+ "code-review",
544
+ "pull-requests",
545
+ "github",
546
+ "testing",
547
+ "automation",
548
+ "agents"
549
+ ],
550
+ "adapters": [
551
+ "claude",
552
+ "codex",
553
+ "cursor",
554
+ "copilot",
555
+ "grok",
556
+ "windsurf",
557
+ "kiro"
558
+ ]
559
+ },
536
560
  {
537
561
  "name": "qodoloop",
538
562
  "lookupName": "olko:qodoloop",
539
563
  "category": "software-development",
540
564
  "path": "packages/software-development/qodoloop",
541
- "description": "Iteratively drives a GitHub PR to zero unresolved Qodo findings \u2014 reads each finding's own Agent Prompt, applies the fix, replies to the thread, resolves it, pushes, and waits for Qodo's next pass.",
565
+ "description": "Iteratively drives a GitHub PR to zero unresolved Qodo findings reads each finding's own Agent Prompt, applies the fix, replies to the thread, resolves it, pushes, and waits for Qodo's next pass.",
542
566
  "tags": [
543
567
  "code-review",
544
568
  "qodo",
@@ -586,7 +610,7 @@
586
610
  "lookupName": "olko:coderabbitloop",
587
611
  "category": "software-development",
588
612
  "path": "packages/software-development/coderabbitloop",
589
- "description": "Iteratively drives a GitHub PR to zero unresolved CodeRabbit findings \u2014 reads each inline comment's own Prompt for AI Agents block, applies the fix, replies to the thread, resolves it, pushes, and re-triggers CodeRabbit.",
613
+ "description": "Iteratively drives a GitHub PR to zero unresolved CodeRabbit findings reads each inline comment's own Prompt for AI Agents block, applies the fix, replies to the thread, resolves it, pushes, and re-triggers CodeRabbit.",
590
614
  "tags": [
591
615
  "code-review",
592
616
  "coderabbit",
@@ -678,7 +702,7 @@
678
702
  "lookupName": "olko:wikipedia-uk-editor",
679
703
  "category": "software-development",
680
704
  "path": "packages/software-development/wikipedia-uk-editor",
681
- "description": "Draft policy-compliant Ukrainian Wikipedia edits \u2014 translate an English article into uk, expand or source an existing uk article, or fix a maintenance backlog item \u2014 and return ready-to-paste wikitext plus an edit summary.",
705
+ "description": "Draft policy-compliant Ukrainian Wikipedia edits translate an English article into uk, expand or source an existing uk article, or fix a maintenance backlog item and return ready-to-paste wikitext plus an edit summary.",
682
706
  "tags": [
683
707
  "wikipedia",
684
708
  "ukrainian",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@olegkoval/agent-skills",
3
- "version": "1.23.0",
3
+ "version": "1.25.0",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -0,0 +1,149 @@
1
+ ---
2
+ name: pr-finalize
3
+ description: >
4
+ Drives a single GitHub PR from "open with loose ends" to genuinely ready-to-merge: rebases off the
5
+ base branch and resolves conflicts, sweeps every review bot (Qodo, CodeRabbit, Greptile) plus human
6
+ comments to zero unaddressed findings, verifies that unit AND browser/E2E coverage was actually
7
+ added for the change, runs the repo's real lint/format/test gates before pushing, and reports what
8
+ still needs a human. Use when the user gives a PR URL or number and says "finalize this PR",
9
+ "fix all outstanding comments", "address the review feedback and push", "get this PR merge-ready",
10
+ or asks to clear what Qodo/CodeRabbit/Greptile could still comment on.
11
+ compatibility: Requires git and gh (GitHub CLI) authenticated. Review-bot sweeps only cover bots actually installed on the repo.
12
+ metadata:
13
+ version: "1.0"
14
+ allowed-tools: Bash(gh:*) Bash(git:*)
15
+ ---
16
+
17
+ # PR Finalize
18
+
19
+ One PR, taken all the way to merge-ready. The job is not "make the bots stop talking" — it is **land the change in a state a careful reviewer would sign off on**, with evidence for every claim.
20
+
21
+ ## Inputs
22
+
23
+ - **PR number or URL** (optional): detect from the current branch if not given.
24
+ - `--no-push` (optional): do everything except the final push. Use when the repo auto-merges and the user wants to eyeball first.
25
+
26
+ ## Non-negotiables
27
+
28
+ These are the failure modes this skill exists to prevent. Violating one makes the whole run worthless:
29
+
30
+ - **Never report a gate as passing without having run it.** Paste the real output. "Tests should pass" is not a result.
31
+ - **Never resolve or claim-fix a finding you didn't actually fix.** Blocked is an honest outcome; a false "done" is not.
32
+ - **Never `git add -A`.** Stage only the files your fixes touched. Start from a clean tree so that's safe.
33
+ - **Never invent test coverage.** If the change has no browser-reachable surface, say so explicitly and name the suite that *is* the real gate. Do not add a hollow E2E test to look thorough.
34
+ - **A green CI badge is not proof.** Many repos split their required check from the full suite (browser-free half only, etc.). Find out what the required check actually runs.
35
+
36
+ ## Instructions
37
+
38
+ ### 1. Establish the ground truth
39
+
40
+ ```bash
41
+ gh pr view <PR> --json number,title,body,state,isDraft,headRefName,baseRefName,mergeable,mergeStateStatus,labels,reviewDecision,statusCheckRollup,url
42
+ ```
43
+
44
+ Record four things before touching code:
45
+
46
+ - **`mergeable`** — `CONFLICTING` means step 2 is mandatory.
47
+ - **Which checks are failing**, and for each, whether it is *required*. Check branch protection (`gh api repos/{owner}/{repo}/branches/<base>/protection`) rather than assuming — a red optional job (a flaky bot-review runner, a nightly) is not a blocker, and burning the run waiting on one is a classic waste.
48
+ - **Whether the repo auto-merges.** Look for a shepherd/automerge workflow in `.github/workflows/` and read its *gating conditions* (required labels, required checks). If pushing could trigger an immediate merge, decide deliberately: either satisfy the review sweep first, or tell the user before you push. Never let an auto-merge race a review you were asked to complete.
49
+ - **Whether a bot review actually ran.** A `SUCCESS` status from a review bot can still mean "rate-limited, never reviewed" — read its comment body, not just the check state.
50
+
51
+ ### 2. Rebase onto the base branch
52
+
53
+ Require a clean tree first (`git status --porcelain` empty), then:
54
+
55
+ ```bash
56
+ git fetch origin <base>
57
+ git rebase origin/<base>
58
+ ```
59
+
60
+ Resolve conflicts by **understanding both sides**, not by picking one. Read the base-side commit that introduced the conflicting hunk (`git log -1 --format=%s <base> -- <file>`, then the diff) — a conflict usually means main changed an invariant your branch is unaware of, and blindly keeping "your" side silently reverts it. State in the PR comment which invariant you preserved and why.
61
+
62
+ After resolving, re-run the tests before continuing — a rebase that compiles is not a rebase that works.
63
+
64
+ ### 3. Sweep every review source
65
+
66
+ Collect findings from all of these; do not stop at the first:
67
+
68
+ ```bash
69
+ # inline review threads (all bots + humans), with resolution state
70
+ gh api repos/{owner}/{repo}/pulls/<PR>/comments --paginate
71
+ # rollup issue comments (where CodeRabbit/Qodo post summaries and rate-limit notices)
72
+ gh api repos/{owner}/{repo}/issues/<PR>/comments --paginate
73
+ # formal reviews
74
+ gh pr view <PR> --json reviews
75
+ ```
76
+
77
+ **Delegate to the dedicated loop skill when one exists** rather than reimplementing its bot's protocol — `qodoloop` for Qodo, `coderabbitloop` for CodeRabbit, `greploop` for Greptile. Each already encodes that bot's posting shape, its ready-made per-finding fix prompt, and its real terminal states. Use this skill's own sweep for human comments and for bots without a dedicated loop.
78
+
79
+ Triage every finding into exactly one bucket:
80
+
81
+ | Bucket | Action |
82
+ |---|---|
83
+ | **Real defect** | Fix it. This is the point of the exercise. |
84
+ | **Legitimate improvement** | Fix it if it's in scope for this PR. |
85
+ | **False positive** | Reply explaining *specifically* why the bot is wrong. Do not resolve silently. |
86
+ | **Needs a human call** | Reply, leave open, surface in the final report. |
87
+
88
+ Bot findings are suggestions from something that has not run the code. A "🐞 Bug" label is a hypothesis — verify it against the actual source before fixing, and against the actual behavior before dismissing.
89
+
90
+ ### 4. Close the coverage gap
91
+
92
+ Ask, for the change as a whole, what would catch a regression here — then check whether the PR actually has it.
93
+
94
+ - **Unit / integration tests:** does every new branch have a test that fails if you invert it? Bots frequently and correctly flag helper functions exercised only *indirectly* through a caller. A direct test per branch is cheap and is usually the right response.
95
+ - **Browser / E2E tests:** determine whether the repo supports them (`playwright.config.*`, `cypress.config.*`, a `test:e2e` script) **and** whether this change has any surface they can reach. Then do one of exactly two things:
96
+ - it has a reachable surface → add or extend the E2E spec;
97
+ - it does not → **say so explicitly in the PR comment**, name why (e.g. "this is entirely inside a Durable Object alarm loop; the E2E harness only serves static assets"), and name the suite that is the real gate.
98
+
99
+ Silence here reads as an oversight. An explicit "not applicable, because X" reads as diligence — and is checkable.
100
+
101
+ ### 5. Run the real gates
102
+
103
+ Discover them from the repo (`Makefile`, `package.json` scripts, CI workflow) — do not guess target names. Run, at minimum, the equivalents of:
104
+
105
+ ```bash
106
+ <lint> # e.g. make lint / npm run lint
107
+ <format> # check mode first; only write if it reports drift
108
+ <tests> # the suite covering the changed package
109
+ ```
110
+
111
+ Capture exit codes, not just output. Repo-specific traps worth checking for before you burn a cycle: linters whose cache replays findings from deleted sibling worktrees, formatters whose local toolchain version outruns CI's (churning unrelated files), and test runners that hang when two runs overlap.
112
+
113
+ If a gate fails, fix it. Do not push red.
114
+
115
+ ### 6. Push and explain
116
+
117
+ Stage only the files you touched, commit, and push (`--force-with-lease` after a rebase — never bare `--force`).
118
+
119
+ Then post **one** PR comment that a reviewer can audit without re-reading the diff:
120
+
121
+ - what the rebase conflict was and which side won, with the reason;
122
+ - each finding, and what you did about it (including the ones you rejected, with the argument);
123
+ - the coverage decision from step 4, including the explicit not-applicable if that's the answer;
124
+ - **verbatim** gate output — real numbers (`# pass 480 / # fail 0`, `0 issues.`), not adjectives.
125
+
126
+ Re-trigger any bot that never actually reviewed (e.g. `@coderabbitai review`) so the PR gets the pass it was owed.
127
+
128
+ ### 7. Verify and report
129
+
130
+ Re-read the PR state after the push — confirm `mergeable` flipped, checks went green, and clear now-stale labels (`needs-rebase`, etc.). Poll re-triggered bots for their new pass and handle anything it raises.
131
+
132
+ ```text
133
+ PR #965 finalized.
134
+ Rebase: 1 conflict resolved (kept main's #834 D1-first ordering)
135
+ Findings: 2 addressed, 0 rejected, 0 blocked
136
+ Coverage: +5 unit tests; E2E not applicable (no browser surface) — stated on the PR
137
+ Gates: tests 480/480, lint 0 issues, format clean
138
+ State: MERGEABLE, checks green
139
+ Needs human: none
140
+ ```
141
+
142
+ If anything is left, say precisely what and why — an honest "blocked on X" is the deliverable when X is genuinely a human call.
143
+
144
+ ## Related skills
145
+
146
+ - `qodoloop` — full Qodo thread protocol (per-finding Agent Prompts, resolve mutations).
147
+ - `coderabbitloop` — full CodeRabbit protocol.
148
+ - `greploop` — drives a PR to a 5/5 Greptile confidence score.
149
+ - `ci-fix-loop` — when the blocker is a failing pipeline rather than review feedback.
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "olko-pr-finalize",
3
+ "description": "Drives one GitHub PR to genuinely merge-ready: rebases and resolves conflicts, sweeps every review bot and human comment to zero unaddressed findings, verifies unit and E2E coverage actually exists, runs the repo's real lint/format/test gates before pushing, and reports what still needs a human.",
4
+ "skills": "./skills"
5
+ }