@olegkoval/agent-skills 1.17.0 → 1.19.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/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +4 -3
- package/.cursor-plugin/index.json +5 -0
- package/.grok-plugin/index.json +125 -0
- package/.kiro/steering/qodoloop.md +127 -0
- package/.windsurf/rules/qodoloop.md +126 -0
- package/README.md +30 -6
- package/catalog/skills.json +69 -22
- package/package.json +3 -2
- package/packages/marketing/search-console-indexing-audit/adapters/grok/plugin.json +6 -0
- package/packages/marketing/search-console-indexing-audit/adapters/grok/skills/search-console-indexing-audit/SKILL.md +69 -0
- package/packages/marketing/search-console-indexing-audit/adapters/grok/skills/search-console-indexing-audit/scripts/summarize_gsc_coverage.py +151 -0
- package/packages/marketing/viral-launch/adapters/grok/plugin.json +6 -0
- package/packages/marketing/viral-launch/adapters/grok/skills/viral-launch/SKILL.md +105 -0
- package/packages/music/fill-music-player/adapters/grok/plugin.json +6 -0
- package/packages/music/fill-music-player/adapters/grok/skills/fill-music-player/SKILL.md +111 -0
- package/packages/photography/gallery/adapters/grok/plugin.json +6 -0
- package/packages/photography/gallery/adapters/grok/skills/gallery/SKILL.md +237 -0
- package/packages/software-development/apple-store-submit/adapters/grok/plugin.json +6 -0
- package/packages/software-development/apple-store-submit/adapters/grok/skills/apple-store-submit/SKILL.md +158 -0
- package/packages/software-development/cloudflare-block-countries/adapters/grok/plugin.json +6 -0
- package/packages/software-development/cloudflare-block-countries/adapters/grok/skills/cloudflare-block-countries/SKILL.md +177 -0
- package/packages/software-development/crash-course/adapters/grok/plugin.json +6 -0
- package/packages/software-development/crash-course/adapters/grok/skills/crash-course/SKILL.md +271 -0
- package/packages/software-development/docs-index-keeper/adapters/grok/plugin.json +6 -0
- package/packages/software-development/docs-index-keeper/adapters/grok/skills/docs-index-keeper/SKILL.md +65 -0
- package/packages/software-development/gh-cli/adapters/grok/plugin.json +6 -0
- package/packages/software-development/gh-cli/adapters/grok/skills/gh-cli/SKILL.md +2200 -0
- package/packages/software-development/git-commit/adapters/grok/plugin.json +6 -0
- package/packages/software-development/git-commit/adapters/grok/skills/git-commit/SKILL.md +133 -0
- package/packages/software-development/macos-menubar-app/adapters/grok/plugin.json +6 -0
- package/packages/software-development/macos-menubar-app/adapters/grok/skills/macos-menubar-app/SKILL.md +238 -0
- package/packages/software-development/mvp-oneshot/adapters/grok/plugin.json +6 -0
- package/packages/software-development/mvp-oneshot/adapters/grok/skills/mvp-oneshot/SKILL.md +176 -0
- package/packages/software-development/obsidian-pr-sync/adapters/grok/plugin.json +6 -0
- package/packages/software-development/obsidian-pr-sync/adapters/grok/skills/obsidian-pr-sync/SKILL.md +154 -0
- package/packages/software-development/obsidian-task-rollover/adapters/grok/plugin.json +6 -0
- package/packages/software-development/obsidian-task-rollover/adapters/grok/skills/obsidian-task-rollover/SKILL.md +198 -0
- package/packages/software-development/open-source-publisher/adapters/grok/plugin.json +6 -0
- package/packages/software-development/open-source-publisher/adapters/grok/skills/open-source-publisher/SKILL.md +471 -0
- package/packages/software-development/product-builder/adapters/grok/plugin.json +6 -0
- package/packages/software-development/product-builder/adapters/grok/skills/product-builder/SKILL.md +224 -0
- package/packages/software-development/promptctl/adapters/grok/plugin.json +6 -0
- package/packages/software-development/promptctl/adapters/grok/skills/promptctl/SKILL.md +90 -0
- package/packages/software-development/qodoloop/SKILL.md +134 -0
- package/packages/software-development/qodoloop/adapters/claude/plugin.json +5 -0
- package/packages/software-development/qodoloop/adapters/claude/skills/qodoloop/SKILL.md +135 -0
- package/packages/software-development/qodoloop/adapters/codex/README.md +20 -0
- package/packages/software-development/qodoloop/adapters/cursor/plugin.json +6 -0
- package/packages/software-development/qodoloop/adapters/cursor/skills/qodoloop/SKILL.md +136 -0
- package/packages/software-development/qodoloop/adapters/grok/plugin.json +6 -0
- package/packages/software-development/qodoloop/adapters/grok/skills/qodoloop/SKILL.md +135 -0
- package/packages/software-development/qodoloop/adapters/kiro/steering/qodoloop.md +127 -0
- package/packages/software-development/qodoloop/adapters/windsurf/rules/qodoloop.md +126 -0
- package/packages/software-development/qodoloop/references/graphql-queries.md +151 -0
- package/packages/software-development/relay/adapters/grok/plugin.json +6 -0
- package/packages/software-development/relay/adapters/grok/skills/relay/SKILL.md +117 -0
- package/packages/software-development/review-past-performance/adapters/grok/plugin.json +6 -0
- package/packages/software-development/review-past-performance/adapters/grok/skills/review-past-performance/SKILL.md +212 -0
- package/packages/software-development/self-critique/adapters/grok/plugin.json +6 -0
- package/packages/software-development/self-critique/adapters/grok/skills/self-critique/SKILL.md +149 -0
- package/packages/software-development/self-critique/adapters/grok/skills/self-critique/scripts/critique-nudge.mjs +57 -0
- package/packages/software-development/semantic-release-beta/adapters/grok/plugin.json +6 -0
- package/packages/software-development/semantic-release-beta/adapters/grok/skills/semantic-release-beta/SKILL.md +59 -0
- package/packages/software-development/skill-budget-audit/adapters/grok/plugin.json +6 -0
- package/packages/software-development/skill-budget-audit/adapters/grok/skills/skill-budget-audit/SKILL.md +146 -0
- package/packages/software-development/starter-rules/adapters/grok/plugin.json +6 -0
- package/packages/software-development/starter-rules/adapters/grok/skills/starter-rules/SKILL.md +73 -0
- package/scripts/build-adapters.sh +47 -4
- package/scripts/validate-catalog.sh +10 -0
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
"name": "Oleg Koval"
|
|
5
5
|
},
|
|
6
6
|
"metadata": {
|
|
7
|
-
"description": "Agent-agnostic skill catalog for Codex, Claude, Cursor, and other skill-aware tools."
|
|
7
|
+
"description": "Agent-agnostic skill catalog for Codex, Claude, Cursor, Grok, Copilot, Windsurf, Kiro, and other skill-aware tools."
|
|
8
8
|
},
|
|
9
9
|
"plugins": [
|
|
10
10
|
{
|
|
11
11
|
"name": "olko-agent-skills",
|
|
12
12
|
"source": "./",
|
|
13
|
-
"description": "Agent-agnostic skill catalog for Codex, Claude, Cursor, and other skill-aware tools."
|
|
13
|
+
"description": "Agent-agnostic skill catalog for Codex, Claude, Cursor, Grok, Copilot, Windsurf, Kiro, and other skill-aware tools."
|
|
14
14
|
}
|
|
15
15
|
]
|
|
16
16
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "olko-agent-skills",
|
|
3
|
-
"description": "Agent-agnostic skill catalog for Codex, Claude, Cursor, and other skill-aware tools.",
|
|
4
|
-
"version": "1.
|
|
3
|
+
"description": "Agent-agnostic skill catalog for Codex, Claude, Cursor, Grok, Copilot, Windsurf, Kiro, and other skill-aware tools.",
|
|
4
|
+
"version": "1.18.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Oleg Koval"
|
|
7
7
|
},
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
"./packages/software-development/apple-store-submit",
|
|
32
32
|
"./packages/software-development/macos-menubar-app",
|
|
33
33
|
"./packages/software-development/skill-budget-audit",
|
|
34
|
-
"./packages/software-development/crash-course"
|
|
34
|
+
"./packages/software-development/crash-course",
|
|
35
|
+
"./packages/software-development/qodoloop"
|
|
35
36
|
]
|
|
36
37
|
}
|
|
@@ -105,6 +105,11 @@
|
|
|
105
105
|
"name": "olko:crash-course",
|
|
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
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"name": "olko:qodoloop",
|
|
111
|
+
"source": "./packages/software-development/qodoloop/adapters/cursor",
|
|
112
|
+
"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."
|
|
108
113
|
}
|
|
109
114
|
]
|
|
110
115
|
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "agent-skills",
|
|
3
|
+
"plugins": [
|
|
4
|
+
{
|
|
5
|
+
"name": "olko:self-critique",
|
|
6
|
+
"source": "./packages/software-development/self-critique/adapters/grok",
|
|
7
|
+
"description": "Adversarially critique your own last answer: spawn a critic agent that verifies claims against live sources, finds the related issue or pattern you missed, then loop until satisfied and report where you were wrong, iterations-to-satisfy, the numeric improvement, and a final score."
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"name": "olko:docs-index-keeper",
|
|
11
|
+
"source": "./packages/software-development/docs-index-keeper/adapters/grok",
|
|
12
|
+
"description": "Keep a Markdown docs index in sync through pre-commit, CI, or one-off maintenance flows."
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"name": "olko:semantic-release-beta",
|
|
16
|
+
"source": "./packages/software-development/semantic-release-beta/adapters/grok",
|
|
17
|
+
"description": "Set up semantic-release-npm-github-publish with stable main releases and prerelease beta releases on a beta branch."
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"name": "olko:gh-cli",
|
|
21
|
+
"source": "./packages/software-development/gh-cli/adapters/grok",
|
|
22
|
+
"description": "Use the GitHub CLI effectively for repositories, PRs, Actions, releases, and more."
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"name": "olko:git-commit",
|
|
26
|
+
"source": "./packages/software-development/git-commit/adapters/grok",
|
|
27
|
+
"description": "Create conventional commits with diff-aware staging and message generation."
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"name": "olko:gallery",
|
|
31
|
+
"source": "./packages/photography/gallery/adapters/grok",
|
|
32
|
+
"description": "Create photo galleries with AI-assisted layout curation and sequencing."
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"name": "olko:promptctl",
|
|
36
|
+
"source": "./packages/software-development/promptctl/adapters/grok",
|
|
37
|
+
"description": "Use promptctl for template-based prompt engineering, scoring, and workflow automation."
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"name": "olko:fill-music-player",
|
|
41
|
+
"source": "./packages/music/fill-music-player/adapters/grok",
|
|
42
|
+
"description": "Fill a portable music player with a curated random selection from a source music library while balancing formats, artists, albums, and capacity."
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"name": "olko:product-builder",
|
|
46
|
+
"source": "./packages/software-development/product-builder/adapters/grok",
|
|
47
|
+
"description": "Build a full-stack web application or SaaS product from a user description using production-oriented defaults."
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"name": "olko:mvp-oneshot",
|
|
51
|
+
"source": "./packages/software-development/mvp-oneshot/adapters/grok",
|
|
52
|
+
"description": "Turn a rough product idea into a shippable one-week MVP in one pass via a four-role prompt chain: scope a build prompt, ruthlessly trim it, plan the build, and self-review the vertical slice."
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"name": "olko:starter-rules",
|
|
56
|
+
"source": "./packages/software-development/starter-rules/adapters/grok",
|
|
57
|
+
"description": "Load and enforce hard rules for every oleg-koval/* starter: 300-line files, E2E tests, pre-commit hooks, Vertical Slice architecture, no comments, KISS/DRY/SOLID."
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"name": "olko:review-past-performance",
|
|
61
|
+
"source": "./packages/software-development/review-past-performance/adapters/grok",
|
|
62
|
+
"description": "Self-improvement loop that pulls the last 24h of ICM memories, git history, and skill analytics to detect repeated mistakes, slow workflows, and missing coverage, then proposes 1-3 concrete improvements."
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"name": "olko:relay",
|
|
66
|
+
"source": "./packages/software-development/relay/adapters/grok",
|
|
67
|
+
"description": "Use claude-relay to run long or rate-limit-prone tasks autonomously across subscription accounts."
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"name": "olko:open-source-publisher",
|
|
71
|
+
"source": "./packages/software-development/open-source-publisher/adapters/grok",
|
|
72
|
+
"description": "Prepare an open-source repository for public publishing with a minimal icon, social preview image, GitHub Pages site, README standardization, CI/CD checks, release hygiene, optional donation setup, and optional motion previews for generated static images."
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"name": "olko:viral-launch",
|
|
76
|
+
"source": "./packages/marketing/viral-launch/adapters/grok",
|
|
77
|
+
"description": "Set up a project repository and launch plan for shareable marketing, public launch readiness, and growth loops."
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"name": "olko:search-console-indexing-audit",
|
|
81
|
+
"source": "./packages/marketing/search-console-indexing-audit/adapters/grok",
|
|
82
|
+
"description": "Analyze Google Search Console Coverage CSV exports and correlate them with sitemap, robots, canonical, redirect, and noindex signals."
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"name": "olko:cloudflare-block-countries",
|
|
86
|
+
"source": "./packages/software-development/cloudflare-block-countries/adapters/grok",
|
|
87
|
+
"description": "Block specific countries via Cloudflare WAF Custom Rules using the Cloudflare API. Handles creating new rulesets and updating existing ones across single or multiple zones."
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"name": "olko:obsidian-pr-sync",
|
|
91
|
+
"source": "./packages/software-development/obsidian-pr-sync/adapters/grok",
|
|
92
|
+
"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."
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"name": "olko:obsidian-task-rollover",
|
|
96
|
+
"source": "./packages/software-development/obsidian-task-rollover/adapters/grok",
|
|
97
|
+
"description": "Bullet-journal end-of-day task migration: copy unchecked tasks from today's Obsidian daily note to the next workday's note under '## Carried over', and mark them [>] in the source. Skips weekends, idempotent."
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"name": "olko:apple-store-submit",
|
|
101
|
+
"source": "./packages/software-development/apple-store-submit/adapters/grok",
|
|
102
|
+
"description": "Handle Apple App Store rejection emails end-to-end: parse rejection reasons, plan fixes, implement code changes, navigate App Store Connect, and resubmit."
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"name": "olko:macos-menubar-app",
|
|
106
|
+
"source": "./packages/software-development/macos-menubar-app/adapters/grok",
|
|
107
|
+
"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."
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"name": "olko:skill-budget-audit",
|
|
111
|
+
"source": "./packages/software-development/skill-budget-audit/adapters/grok",
|
|
112
|
+
"description": "Diagnose and fix Claude Code skill context budget overflow — identify heavy plugin bundles, remove domain-specific ones, and restore skill discoverability."
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"name": "olko:crash-course",
|
|
116
|
+
"source": "./packages/software-development/crash-course/adapters/grok",
|
|
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
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"name": "olko:qodoloop",
|
|
121
|
+
"source": "./packages/software-development/qodoloop/adapters/grok",
|
|
122
|
+
"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."
|
|
123
|
+
}
|
|
124
|
+
]
|
|
125
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
<!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
inclusion: manual
|
|
5
|
+
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."
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Qodoloop
|
|
9
|
+
|
|
10
|
+
Fix every actionable Qodo finding on a PR, answer each thread, resolve it, and keep going until Qodo has nothing left to say (or a finding needs a human call).
|
|
11
|
+
|
|
12
|
+
## Inputs
|
|
13
|
+
|
|
14
|
+
- **PR number** (optional): detect from the current branch if not given.
|
|
15
|
+
- **Include optional findings** (optional, default off): Qodo tags each finding "Review recommended" (actionable) or "Optional" (informational/lower-confidence). By default only "Review recommended" findings count toward done; pass `--include-optional` to also fix and resolve the optional ones.
|
|
16
|
+
|
|
17
|
+
## How Qodo actually posts (verified against a live install — don't assume otherwise)
|
|
18
|
+
|
|
19
|
+
Qodo runs as `qodo-code-review[bot]` and posts **two independent things** per review pass, not one:
|
|
20
|
+
|
|
21
|
+
1. A rollup **issue comment** titled `<h3>Code Review by Qodo</h3>` — human-readable, all findings in one place. A separate `<h3>PR Summary by Qodo</h3>` comment is a plain description, not a review — ignore it. While running, Qodo posts `<h3>Qodo is busy working</h3>` as its own comment (not an edit of a prior one).
|
|
22
|
+
2. A **formal PR review** (`state: COMMENTED`) carrying one **inline review comment per finding**, each a real, resolvable GitHub review thread at the finding's file/line — same machinery as any human inline comment.
|
|
23
|
+
|
|
24
|
+
**Use the inline threads as the source of truth.** They carry `isResolved` state natively (fetch via GraphQL, see `references/graphql-queries.md`), so "done" is answerable directly instead of re-parsing the rollup's HTML on every iteration. Each thread's body contains a `<details><summary>Agent Prompt</summary>` (or `**Agent Prompt**`) section with a ready-made fix spec, and a severity badge image whose `alt` text is `Remediation recommended` or `Informational` (recommended ↔ "Review recommended", informational ↔ "Optional").
|
|
25
|
+
|
|
26
|
+
Qodo has **no check run to poll** — there is nothing in `gh pr checks` to wait on. Completion means a new `qodo-code-review[bot]` comment/review appears after your push; poll comments, not checks.
|
|
27
|
+
|
|
28
|
+
**Rate limit is a real terminal state, not a bug.** A completed-looking comment reading "Qodo reviews are paused" / "you've reached your PR review limit" means Qodo will not review again this cycle — stop and report it, don't loop waiting for something that isn't coming.
|
|
29
|
+
|
|
30
|
+
## Instructions
|
|
31
|
+
|
|
32
|
+
### 1. Identify the PR
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
gh pr view --json number,headRefName,headRefOid -q '{number, branch: .headRefName, sha: .headRefOid}'
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Check out the branch if not already on it.
|
|
39
|
+
|
|
40
|
+
### 2. Loop (max 5 iterations)
|
|
41
|
+
|
|
42
|
+
#### A. Wait for a review of the current head
|
|
43
|
+
|
|
44
|
+
On **iteration 1**, if there is nothing to push yet (you haven't fixed anything in this loop), don't wait for a brand-new review — use whatever Qodo has already posted as your starting point and go straight to step B. Otherwise:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
SINCE=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
|
48
|
+
git push
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Poll (every ~10s, timeout ~5min), fetching **every page** of comments, not just the first:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
gh api --paginate "repos/{owner}/{repo}/issues/<PR_NUMBER>/comments?per_page=100" | jq -s '
|
|
55
|
+
add | map(select(.user.login == "qodo-code-review[bot]")) | sort_by(.created_at)'
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
From the comments created **after `$SINCE`** (ignore anything older — that's leftover from a prior push, not this one):
|
|
59
|
+
- Any of them contains "review limit" or "paused" → **stop the loop now**, go to Report with `blocked: rate-limited`.
|
|
60
|
+
- The latest one starts with `<h3>Code Review by Qodo</h3>` → proceed to step B.
|
|
61
|
+
- Otherwise (nothing yet, or only "Qodo is busy working") → sleep 10s and poll again, up to the 5-minute timeout.
|
|
62
|
+
|
|
63
|
+
#### B. Fetch unresolved findings
|
|
64
|
+
|
|
65
|
+
Run the paginated GraphQL query in `references/graphql-queries.md` (`unresolvedQodoThreads`) — **follow `pageInfo.hasNextPage`/`endCursor` until it's exhausted**; a PR with more than 100 Qodo threads silently loses every finding past the first page otherwise. For each unresolved thread from `qodo-code-review[bot]`: parse the finding title, severity (recommended/optional), file/line, and the **Agent Prompt** block.
|
|
66
|
+
|
|
67
|
+
Build the working set: all `recommended` threads, plus `optional` ones too if `--include-optional`.
|
|
68
|
+
|
|
69
|
+
#### C. Check exit conditions
|
|
70
|
+
|
|
71
|
+
Stop if the working set is empty, or max iterations reached.
|
|
72
|
+
|
|
73
|
+
#### D. Fix each finding
|
|
74
|
+
|
|
75
|
+
For each thread in the working set, in order: read the Agent Prompt in full — it already names the issue, the context, the fix focus files/lines, and often the suggested fix. Apply it. Do not go beyond its stated scope. Track two lists as you go: **fixed** (thread id + the exact files you touched for it) and **blocked** (thread id + why — the prompt's suggestion was wrong, unsafe, or needs a product decision). Do not force a fix into the blocked list; do not resolve anything yet.
|
|
76
|
+
|
|
77
|
+
#### E. Commit and push
|
|
78
|
+
|
|
79
|
+
If **fixed** is empty, skip straight to F (nothing to commit). Otherwise, stage **only the files you touched in D** — never `git add -A`, which can sweep in unrelated local changes or secrets that have nothing to do with this loop:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
git add <files touched by this iteration's fixes>
|
|
83
|
+
git commit -m "address Qodo review feedback (qodoloop iteration N)"
|
|
84
|
+
git push
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Confirm the push actually succeeded before moving on — a resolved thread whose fix never made it to the branch is worse than an unresolved one.
|
|
88
|
+
|
|
89
|
+
#### F. Answer each finding
|
|
90
|
+
|
|
91
|
+
This is the "answer to the comments" half of the job, not optional cleanup — and it only runs **after** E's push is confirmed durable, so a thread is never marked resolved while its fix still only exists locally:
|
|
92
|
+
|
|
93
|
+
- **Fixed** findings: reply with one or two sentences (what you changed and why), **then** resolve:
|
|
94
|
+
```bash
|
|
95
|
+
gh api graphql -f query='
|
|
96
|
+
mutation($threadId: ID!, $body: String!) {
|
|
97
|
+
addPullRequestReviewThreadReply(input: {pullRequestReviewThreadId: $threadId, body: $body}) {
|
|
98
|
+
comment { id }
|
|
99
|
+
}
|
|
100
|
+
}' -f threadId="$THREAD_ID" -f body="$REPLY_TEXT"
|
|
101
|
+
```
|
|
102
|
+
Pass the thread id and reply text as GraphQL **variables** (`-f threadId=... -f body=...`), never interpolated into the query string itself — a reply containing a quote, backtick, or newline breaks (or worse, injects into) a hand-built query. Then resolve with `resolveReviewThread` (see references file).
|
|
103
|
+
- **Blocked** findings: reply explaining exactly why (false positive / needs a human call), but **do not resolve** — leave the thread open. A blocked finding that gets silently resolved is a false "done".
|
|
104
|
+
|
|
105
|
+
Go back to step A.
|
|
106
|
+
|
|
107
|
+
### 3. Report
|
|
108
|
+
|
|
109
|
+
| Field | Value |
|
|
110
|
+
|--------------------|-------|
|
|
111
|
+
| Iterations | N |
|
|
112
|
+
| Findings resolved | N |
|
|
113
|
+
| Findings blocked | N (with reasons, left unresolved) |
|
|
114
|
+
| Remaining | N (if any) |
|
|
115
|
+
| Blocked | rate-limited / human-intervention / max-iterations / none |
|
|
116
|
+
|
|
117
|
+
```text
|
|
118
|
+
Qodoloop complete.
|
|
119
|
+
Iterations: 2
|
|
120
|
+
Resolved: 4 (fixed, replied + resolved)
|
|
121
|
+
Blocked: 1 (needs a human call, replied, left unresolved)
|
|
122
|
+
Remaining: 0
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## References
|
|
126
|
+
|
|
127
|
+
- `references/graphql-queries.md` — the exact `unresolvedQodoThreads` query and the `resolveReviewThread` / `addPullRequestReviewThreadReply` mutations, with field notes.
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
<!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
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."
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Qodoloop
|
|
8
|
+
|
|
9
|
+
Fix every actionable Qodo finding on a PR, answer each thread, resolve it, and keep going until Qodo has nothing left to say (or a finding needs a human call).
|
|
10
|
+
|
|
11
|
+
## Inputs
|
|
12
|
+
|
|
13
|
+
- **PR number** (optional): detect from the current branch if not given.
|
|
14
|
+
- **Include optional findings** (optional, default off): Qodo tags each finding "Review recommended" (actionable) or "Optional" (informational/lower-confidence). By default only "Review recommended" findings count toward done; pass `--include-optional` to also fix and resolve the optional ones.
|
|
15
|
+
|
|
16
|
+
## How Qodo actually posts (verified against a live install — don't assume otherwise)
|
|
17
|
+
|
|
18
|
+
Qodo runs as `qodo-code-review[bot]` and posts **two independent things** per review pass, not one:
|
|
19
|
+
|
|
20
|
+
1. A rollup **issue comment** titled `<h3>Code Review by Qodo</h3>` — human-readable, all findings in one place. A separate `<h3>PR Summary by Qodo</h3>` comment is a plain description, not a review — ignore it. While running, Qodo posts `<h3>Qodo is busy working</h3>` as its own comment (not an edit of a prior one).
|
|
21
|
+
2. A **formal PR review** (`state: COMMENTED`) carrying one **inline review comment per finding**, each a real, resolvable GitHub review thread at the finding's file/line — same machinery as any human inline comment.
|
|
22
|
+
|
|
23
|
+
**Use the inline threads as the source of truth.** They carry `isResolved` state natively (fetch via GraphQL, see `references/graphql-queries.md`), so "done" is answerable directly instead of re-parsing the rollup's HTML on every iteration. Each thread's body contains a `<details><summary>Agent Prompt</summary>` (or `**Agent Prompt**`) section with a ready-made fix spec, and a severity badge image whose `alt` text is `Remediation recommended` or `Informational` (recommended ↔ "Review recommended", informational ↔ "Optional").
|
|
24
|
+
|
|
25
|
+
Qodo has **no check run to poll** — there is nothing in `gh pr checks` to wait on. Completion means a new `qodo-code-review[bot]` comment/review appears after your push; poll comments, not checks.
|
|
26
|
+
|
|
27
|
+
**Rate limit is a real terminal state, not a bug.** A completed-looking comment reading "Qodo reviews are paused" / "you've reached your PR review limit" means Qodo will not review again this cycle — stop and report it, don't loop waiting for something that isn't coming.
|
|
28
|
+
|
|
29
|
+
## Instructions
|
|
30
|
+
|
|
31
|
+
### 1. Identify the PR
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
gh pr view --json number,headRefName,headRefOid -q '{number, branch: .headRefName, sha: .headRefOid}'
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Check out the branch if not already on it.
|
|
38
|
+
|
|
39
|
+
### 2. Loop (max 5 iterations)
|
|
40
|
+
|
|
41
|
+
#### A. Wait for a review of the current head
|
|
42
|
+
|
|
43
|
+
On **iteration 1**, if there is nothing to push yet (you haven't fixed anything in this loop), don't wait for a brand-new review — use whatever Qodo has already posted as your starting point and go straight to step B. Otherwise:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
SINCE=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
|
47
|
+
git push
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Poll (every ~10s, timeout ~5min), fetching **every page** of comments, not just the first:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
gh api --paginate "repos/{owner}/{repo}/issues/<PR_NUMBER>/comments?per_page=100" | jq -s '
|
|
54
|
+
add | map(select(.user.login == "qodo-code-review[bot]")) | sort_by(.created_at)'
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
From the comments created **after `$SINCE`** (ignore anything older — that's leftover from a prior push, not this one):
|
|
58
|
+
- Any of them contains "review limit" or "paused" → **stop the loop now**, go to Report with `blocked: rate-limited`.
|
|
59
|
+
- The latest one starts with `<h3>Code Review by Qodo</h3>` → proceed to step B.
|
|
60
|
+
- Otherwise (nothing yet, or only "Qodo is busy working") → sleep 10s and poll again, up to the 5-minute timeout.
|
|
61
|
+
|
|
62
|
+
#### B. Fetch unresolved findings
|
|
63
|
+
|
|
64
|
+
Run the paginated GraphQL query in `references/graphql-queries.md` (`unresolvedQodoThreads`) — **follow `pageInfo.hasNextPage`/`endCursor` until it's exhausted**; a PR with more than 100 Qodo threads silently loses every finding past the first page otherwise. For each unresolved thread from `qodo-code-review[bot]`: parse the finding title, severity (recommended/optional), file/line, and the **Agent Prompt** block.
|
|
65
|
+
|
|
66
|
+
Build the working set: all `recommended` threads, plus `optional` ones too if `--include-optional`.
|
|
67
|
+
|
|
68
|
+
#### C. Check exit conditions
|
|
69
|
+
|
|
70
|
+
Stop if the working set is empty, or max iterations reached.
|
|
71
|
+
|
|
72
|
+
#### D. Fix each finding
|
|
73
|
+
|
|
74
|
+
For each thread in the working set, in order: read the Agent Prompt in full — it already names the issue, the context, the fix focus files/lines, and often the suggested fix. Apply it. Do not go beyond its stated scope. Track two lists as you go: **fixed** (thread id + the exact files you touched for it) and **blocked** (thread id + why — the prompt's suggestion was wrong, unsafe, or needs a product decision). Do not force a fix into the blocked list; do not resolve anything yet.
|
|
75
|
+
|
|
76
|
+
#### E. Commit and push
|
|
77
|
+
|
|
78
|
+
If **fixed** is empty, skip straight to F (nothing to commit). Otherwise, stage **only the files you touched in D** — never `git add -A`, which can sweep in unrelated local changes or secrets that have nothing to do with this loop:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
git add <files touched by this iteration's fixes>
|
|
82
|
+
git commit -m "address Qodo review feedback (qodoloop iteration N)"
|
|
83
|
+
git push
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Confirm the push actually succeeded before moving on — a resolved thread whose fix never made it to the branch is worse than an unresolved one.
|
|
87
|
+
|
|
88
|
+
#### F. Answer each finding
|
|
89
|
+
|
|
90
|
+
This is the "answer to the comments" half of the job, not optional cleanup — and it only runs **after** E's push is confirmed durable, so a thread is never marked resolved while its fix still only exists locally:
|
|
91
|
+
|
|
92
|
+
- **Fixed** findings: reply with one or two sentences (what you changed and why), **then** resolve:
|
|
93
|
+
```bash
|
|
94
|
+
gh api graphql -f query='
|
|
95
|
+
mutation($threadId: ID!, $body: String!) {
|
|
96
|
+
addPullRequestReviewThreadReply(input: {pullRequestReviewThreadId: $threadId, body: $body}) {
|
|
97
|
+
comment { id }
|
|
98
|
+
}
|
|
99
|
+
}' -f threadId="$THREAD_ID" -f body="$REPLY_TEXT"
|
|
100
|
+
```
|
|
101
|
+
Pass the thread id and reply text as GraphQL **variables** (`-f threadId=... -f body=...`), never interpolated into the query string itself — a reply containing a quote, backtick, or newline breaks (or worse, injects into) a hand-built query. Then resolve with `resolveReviewThread` (see references file).
|
|
102
|
+
- **Blocked** findings: reply explaining exactly why (false positive / needs a human call), but **do not resolve** — leave the thread open. A blocked finding that gets silently resolved is a false "done".
|
|
103
|
+
|
|
104
|
+
Go back to step A.
|
|
105
|
+
|
|
106
|
+
### 3. Report
|
|
107
|
+
|
|
108
|
+
| Field | Value |
|
|
109
|
+
|--------------------|-------|
|
|
110
|
+
| Iterations | N |
|
|
111
|
+
| Findings resolved | N |
|
|
112
|
+
| Findings blocked | N (with reasons, left unresolved) |
|
|
113
|
+
| Remaining | N (if any) |
|
|
114
|
+
| Blocked | rate-limited / human-intervention / max-iterations / none |
|
|
115
|
+
|
|
116
|
+
```text
|
|
117
|
+
Qodoloop complete.
|
|
118
|
+
Iterations: 2
|
|
119
|
+
Resolved: 4 (fixed, replied + resolved)
|
|
120
|
+
Blocked: 1 (needs a human call, replied, left unresolved)
|
|
121
|
+
Remaining: 0
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## References
|
|
125
|
+
|
|
126
|
+
- `references/graphql-queries.md` — the exact `unresolvedQodoThreads` query and the `resolveReviewThread` / `addPullRequestReviewThreadReply` mutations, with field notes.
|
package/README.md
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
<h1>agent skills</h1>
|
|
3
|
-
<p><strong>Agent-agnostic skill catalog for Codex, Claude, Cursor, Copilot, Windsurf, Kiro, and other skill-aware tools.</strong></p>
|
|
3
|
+
<p><strong>Agent-agnostic skill catalog for Codex, Claude, Cursor, Grok, Copilot, Windsurf, Kiro, and other skill-aware tools.</strong></p>
|
|
4
4
|
<p>
|
|
5
5
|
<img src="https://img.shields.io/badge/license-MIT-16a34a" alt="MIT license">
|
|
6
|
-
<img src="https://img.shields.io/badge/skills-
|
|
7
|
-
<img src="https://img.shields.io/badge/platforms-Codex%20%7C%20Claude%20%7C%20Cursor%20%7C%20Copilot%20%7C%20Windsurf%20%7C%20Kiro-111827" alt="Codex Claude Cursor Copilot Windsurf Kiro">
|
|
6
|
+
<img src="https://img.shields.io/badge/skills-24-2563eb" alt="24 skills">
|
|
7
|
+
<img src="https://img.shields.io/badge/platforms-Codex%20%7C%20Claude%20%7C%20Cursor%20%7C%20Grok%20%7C%20Copilot%20%7C%20Windsurf%20%7C%20Kiro-111827" alt="Codex Claude Cursor Grok Copilot Windsurf Kiro">
|
|
8
8
|
<img src="https://img.shields.io/badge/status-public%20catalog-16a34a" alt="Public catalog">
|
|
9
9
|
</p>
|
|
10
10
|
</div>
|
|
11
11
|
|
|
12
|
-
Agent-agnostic skill collection for Codex, Claude, Cursor, and other skill-aware tools.
|
|
12
|
+
Agent-agnostic skill collection for Codex, Claude, Cursor, Grok, and other skill-aware tools.
|
|
13
13
|
|
|
14
14
|
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.
|
|
15
15
|
|
|
@@ -76,6 +76,27 @@ claude --plugin-dir /path/to/agent-skills
|
|
|
76
76
|
|
|
77
77
|
</details>
|
|
78
78
|
|
|
79
|
+
<details>
|
|
80
|
+
<summary><b>Grok</b></summary>
|
|
81
|
+
|
|
82
|
+
Grok (xAI) supports plugins via marketplace or direct path. Add this catalog as a marketplace source:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
grok plugin marketplace add oleg-koval/agent-skills
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Or for local development / direct use:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
grok agent --plugin-dir /path/to/agent-skills
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Skills are available via their `olko:*` names or through the installed plugin. Grok discovers `plugin.json` + `skills/` (and falls back to `.claude-plugin/` manifests for compatibility).
|
|
95
|
+
|
|
96
|
+
The repo generates `.grok-plugin/index.json` for structured plugin discovery.
|
|
97
|
+
|
|
98
|
+
</details>
|
|
99
|
+
|
|
79
100
|
<details>
|
|
80
101
|
<summary><b>Cursor</b></summary>
|
|
81
102
|
|
|
@@ -115,11 +136,11 @@ packages/{category}/{skill}/SKILL.md
|
|
|
115
136
|
|
|
116
137
|
</details>
|
|
117
138
|
|
|
118
|
-
## All
|
|
139
|
+
## All 24 Skills
|
|
119
140
|
|
|
120
141
|
Each entry links to its `SKILL.md`. Reference any skill by its `olko:*` lookup name in a new agent session.
|
|
121
142
|
|
|
122
|
-
### Software development (
|
|
143
|
+
### Software development (21)
|
|
123
144
|
|
|
124
145
|
| Skill | What it does | Use when |
|
|
125
146
|
|-------|-------------|----------|
|
|
@@ -139,6 +160,7 @@ Each entry links to its `SKILL.md`. Reference any skill by its `olko:*` lookup n
|
|
|
139
160
|
| [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 |
|
|
140
161
|
| [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 |
|
|
141
162
|
| [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 |
|
|
163
|
+
| [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 |
|
|
142
164
|
| [review-past-performance](packages/software-development/review-past-performance/SKILL.md) | Pulls 24h of ICM memories, git history, and skill analytics; detects repeated mistakes and slow workflows; proposes 1-3 concrete fixes | Daily self-improvement loop or codifying a repeated workflow |
|
|
143
165
|
| [semantic-release-beta](packages/software-development/semantic-release-beta/SKILL.md) | Sets up `semantic-release` with stable `main` releases and beta prereleases on a `beta` branch | A Node package needs stable npm publishing plus beta prereleases |
|
|
144
166
|
| [skill-budget-audit](packages/software-development/skill-budget-audit/SKILL.md) | Diagnoses and fixes Claude Code's skill context budget overflow — identifies heavy plugin bundles that exceed the 2% budget | Skills failing to load or Claude hitting context limits from plugin bundles |
|
|
@@ -204,6 +226,7 @@ When adding or changing a skill:
|
|
|
204
226
|
| Claude Code | `.claude-plugin/marketplace.json` | Marketplace plugin registry |
|
|
205
227
|
| Claude Code | `.claude-plugin/plugin.json` | Plugin manifest |
|
|
206
228
|
| Cursor | `.cursor-plugin/index.json` | Plugin index |
|
|
229
|
+
| Grok | `.grok-plugin/index.json` | Plugin index (plus `.claude-plugin/` compatibility) |
|
|
207
230
|
| GitHub Copilot | `.github/copilot-instructions.md` | Repository instructions |
|
|
208
231
|
| GitHub Copilot | `.github/prompts/*.prompt.md` | Per-skill prompt files |
|
|
209
232
|
| Windsurf | `.windsurf/rules/*.md` | Cascade rules |
|
|
@@ -223,6 +246,7 @@ packages/{category}/{skill}/
|
|
|
223
246
|
├── codex/
|
|
224
247
|
├── claude/
|
|
225
248
|
├── cursor/
|
|
249
|
+
├── grok/
|
|
226
250
|
├── windsurf/
|
|
227
251
|
└── kiro/
|
|
228
252
|
```
|