@olegkoval/agent-skills 1.51.0 → 1.51.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/.github/prompts/codexloop.prompt.md +7 -0
  2. package/.kiro/steering/codexloop.md +7 -0
  3. package/.windsurf/rules/codexloop.md +7 -0
  4. package/adapters/claude/olko-github-pr/skills/codexloop/SKILL.md +7 -0
  5. package/adapters/claude/olko-github-pr/skills/lekker-review/references/output-format.md +5 -1
  6. package/adapters/claude/olko-github-pr/skills/lekker-review/references/pricing.json +5 -1
  7. package/adapters/claude/olko-github-pr/skills/lekker-review/references/revmux/profiles/lekker-deep-codex.md +2 -2
  8. package/adapters/claude/olko-github-pr/skills/lekker-review/references/revmux/profiles/lekker-medium-codex.md +2 -2
  9. package/adapters/cursor/olko-github-pr/skills/codexloop/SKILL.md +7 -0
  10. package/adapters/grok/olko-github-pr/skills/codexloop/SKILL.md +7 -0
  11. package/package.json +1 -1
  12. package/plugins/olko-apple-kit/.claude-plugin/plugin.json +1 -1
  13. package/plugins/olko-creative/.claude-plugin/plugin.json +1 -1
  14. package/plugins/olko-garmin-kit/.claude-plugin/plugin.json +1 -1
  15. package/plugins/olko-git-tools/.claude-plugin/plugin.json +1 -1
  16. package/plugins/olko-github-pr/.claude-plugin/plugin.json +1 -1
  17. package/plugins/olko-github-pr/skills/codexloop/SKILL.md +7 -0
  18. package/plugins/olko-github-pr/skills/lekker-review/references/output-format.md +5 -1
  19. package/plugins/olko-github-pr/skills/lekker-review/references/pricing.json +5 -1
  20. package/plugins/olko-github-pr/skills/lekker-review/references/revmux/profiles/lekker-deep-codex.md +2 -2
  21. package/plugins/olko-github-pr/skills/lekker-review/references/revmux/profiles/lekker-medium-codex.md +2 -2
  22. package/plugins/olko-obsidian/.claude-plugin/plugin.json +1 -1
  23. package/plugins/olko-product/.claude-plugin/plugin.json +1 -1
  24. package/plugins/olko-reflection/.claude-plugin/plugin.json +1 -1
  25. package/plugins/olko-release/.claude-plugin/plugin.json +1 -1
  26. package/plugins/olko-skill-meta/.claude-plugin/plugin.json +1 -1
  27. package/plugins/olko-web-ops/.claude-plugin/plugin.json +1 -1
@@ -228,6 +228,13 @@ while : ; do
228
228
  }
229
229
  }')
230
230
  echo "$PAGE" # collect nodes from every page before deciding the PR is clean
231
+ # GitHub GraphQL returns transient 502/504s (no .data). An empty page reads as
232
+ # "no next page", so retry it a bounded number of times instead of treating it as clean.
233
+ if ! echo "$PAGE" | jq -e '.data' >/dev/null 2>&1; then
234
+ RETRIES=$(( ${RETRIES:-0} + 1 ))
235
+ [ "$RETRIES" -le 3 ] || { echo "GraphQL still failing after 3 retries; threads unknown, not clean"; exit 1; }
236
+ sleep 5; continue
237
+ fi
231
238
  PI='.data.repository.pullRequest.reviewThreads.pageInfo'
232
239
  [ "$(echo "$PAGE" | jq -r "$PI.hasNextPage")" = "true" ] || break
233
240
  CURSOR=$(echo "$PAGE" | jq -r "$PI.endCursor")
@@ -227,6 +227,13 @@ while : ; do
227
227
  }
228
228
  }')
229
229
  echo "$PAGE" # collect nodes from every page before deciding the PR is clean
230
+ # GitHub GraphQL returns transient 502/504s (no .data). An empty page reads as
231
+ # "no next page", so retry it a bounded number of times instead of treating it as clean.
232
+ if ! echo "$PAGE" | jq -e '.data' >/dev/null 2>&1; then
233
+ RETRIES=$(( ${RETRIES:-0} + 1 ))
234
+ [ "$RETRIES" -le 3 ] || { echo "GraphQL still failing after 3 retries; threads unknown, not clean"; exit 1; }
235
+ sleep 5; continue
236
+ fi
230
237
  PI='.data.repository.pullRequest.reviewThreads.pageInfo'
231
238
  [ "$(echo "$PAGE" | jq -r "$PI.hasNextPage")" = "true" ] || break
232
239
  CURSOR=$(echo "$PAGE" | jq -r "$PI.endCursor")
@@ -226,6 +226,13 @@ while : ; do
226
226
  }
227
227
  }')
228
228
  echo "$PAGE" # collect nodes from every page before deciding the PR is clean
229
+ # GitHub GraphQL returns transient 502/504s (no .data). An empty page reads as
230
+ # "no next page", so retry it a bounded number of times instead of treating it as clean.
231
+ if ! echo "$PAGE" | jq -e '.data' >/dev/null 2>&1; then
232
+ RETRIES=$(( ${RETRIES:-0} + 1 ))
233
+ [ "$RETRIES" -le 3 ] || { echo "GraphQL still failing after 3 retries; threads unknown, not clean"; exit 1; }
234
+ sleep 5; continue
235
+ fi
229
236
  PI='.data.repository.pullRequest.reviewThreads.pageInfo'
230
237
  [ "$(echo "$PAGE" | jq -r "$PI.hasNextPage")" = "true" ] || break
231
238
  CURSOR=$(echo "$PAGE" | jq -r "$PI.endCursor")
@@ -235,6 +235,13 @@ while : ; do
235
235
  }
236
236
  }')
237
237
  echo "$PAGE" # collect nodes from every page before deciding the PR is clean
238
+ # GitHub GraphQL returns transient 502/504s (no .data). An empty page reads as
239
+ # "no next page", so retry it a bounded number of times instead of treating it as clean.
240
+ if ! echo "$PAGE" | jq -e '.data' >/dev/null 2>&1; then
241
+ RETRIES=$(( ${RETRIES:-0} + 1 ))
242
+ [ "$RETRIES" -le 3 ] || { echo "GraphQL still failing after 3 retries; threads unknown, not clean"; exit 1; }
243
+ sleep 5; continue
244
+ fi
238
245
  PI='.data.repository.pullRequest.reviewThreads.pageInfo'
239
246
  [ "$(echo "$PAGE" | jq -r "$PI.hasNextPage")" = "true" ] || break
240
247
  CURSOR=$(echo "$PAGE" | jq -r "$PI.endCursor")
@@ -228,7 +228,11 @@ Input tokens: ~<N> ← estimated: diff tokens × agent passes + context fil
228
228
  Cost: ~$<X.XX> (output actual, input estimated; blended across model tiers below)
229
229
  ```
230
230
 
231
- Per-MTok pricing (input/output), verified 2026-07-07 from the claude-api reference; re-check there if models changed:
231
+ Per-MTok pricing (input/output), verified 2026-07-07 from the claude-api reference; re-check there if models changed. The Claude 5.5 rows and fable-5-1 are not yet on that sheet: they reuse the predecessor-tier rates and must be re-checked:
232
+ - claude-fable-5-1: $10 / $50 (unverified, as claude-fable-5)
233
+ - claude-opus-5-5: $15 / $75 (unverified; copied from the opus-5 rate in pricing.json, not checked)
234
+ - claude-sonnet-5-5: $3 / $15 (unverified)
235
+ - claude-haiku-5-5: $1 / $5 (unverified)
232
236
  - claude-fable-5: $10 / $50
233
237
  - claude-opus-4-8: $5 / $25
234
238
  - claude-sonnet-4-6 / claude-sonnet-5: $3 / $15
@@ -1,5 +1,9 @@
1
1
  {
2
- "note": "USD per million tokens, keyed by revmux's actual_model. revmux runs `claude --print` under subscription (Max plan) auth, so nothing here is a real API bill; this is an API-list-price ESTIMATE for the cost block only. Where a model exposes separate input/output prices, usd = tokens/1e6 * output price (output-only, not blended), because revmux reports a single combined `tokens` figure per agent with no input/output split to weight a blend. verified:false entries are not confirmed against a current price sheet (no local claude-api pricing doc found on this machine as of 2026-09-09) and must be checked before this cost block is trusted for a real decision.",
2
+ "note": "USD per million tokens, keyed by revmux's actual_model. revmux runs `claude --print` under subscription (Max plan) auth, so nothing here is a real API bill; this is an API-list-price ESTIMATE for the cost block only. Where a model exposes separate input/output prices, usd = tokens/1e6 * output price (output-only, not blended), because revmux reports a single combined `tokens` figure per agent with no input/output split to weight a blend. verified:false entries are not confirmed against a current price sheet (no local claude-api pricing doc found on this machine as of 2026-09-09) and must be checked before this cost block is trusted for a real decision. The claude-*-5-5 and claude-fable-5-1 rows carry the prices of their predecessor tier (fable: $10/$50 as listed in output-format.md; opus/sonnet/haiku: the 5-family rates above) until a price sheet confirms the new models.",
3
+ "claude-fable-5-1": { "input": 10, "output": 50, "blended": 30, "verified": false },
4
+ "claude-opus-5-5": { "input": 15, "output": 75, "blended": 45, "verified": false },
5
+ "claude-sonnet-5-5": { "input": 3, "output": 15, "blended": 9, "verified": false },
6
+ "claude-haiku-5-5": { "input": 1, "output": 5, "blended": 3, "verified": false },
3
7
  "claude-opus-5": { "input": 15, "output": 75, "blended": 45, "verified": false },
4
8
  "claude-sonnet-5": { "input": 3, "output": 15, "blended": 9, "verified": false },
5
9
  "claude-haiku-4-5-20251001": { "input": 1, "output": 5, "blended": 3, "verified": false },
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  description: Deep lekker review using Codex agents and a second implementation pass
3
- model: codex/gpt-5.6-sol:high
3
+ model: codex/gpt-6-astra:high
4
4
  agents:
5
5
  - {name: quality+impl, lenses: [lekker-quality, lekker-implementation], color: cyan}
6
6
  - {name: simpl+conventions, lenses: [lekker-simplification, lekker-conventions], color: magenta}
7
7
  - {name: tests, lenses: [lekker-test-quality, tests], color: green}
8
8
  - {name: adversarial, lenses: [adversarial], color: yellow}
9
9
  - {name: bugs+impl, lenses: [bugs, impl], color: blue}
10
- stages: {synthesis: codex/gpt-5.6-sol:high, verify: codex/gpt-5.6-sol:high}
10
+ stages: {synthesis: codex/gpt-6-astra:high, verify: codex/gpt-6-astra:high}
11
11
  ---
12
12
  You are one read-only reviewer on a panel. Other reviewers apply different
13
13
  lenses to the same change. Report only findings supported by your own lenses.
@@ -1,12 +1,12 @@
1
1
  ---
2
2
  description: Medium-depth lekker review using Codex agents
3
- model: codex/gpt-5.6-sol:high
3
+ model: codex/gpt-6-astra:high
4
4
  agents:
5
5
  - {name: quality+impl, lenses: [lekker-quality, lekker-implementation], color: cyan}
6
6
  - {name: simpl+conventions, lenses: [lekker-simplification, lekker-conventions], color: magenta}
7
7
  - {name: tests, lenses: [lekker-test-quality, tests], color: green}
8
8
  - {name: adversarial, lenses: [adversarial], color: yellow}
9
- stages: {synthesis: codex/gpt-5.6-sol:high, verify: codex/gpt-5.6-sol:high}
9
+ stages: {synthesis: codex/gpt-6-astra:high, verify: codex/gpt-6-astra:high}
10
10
  ---
11
11
  You are one read-only reviewer on a panel. Other reviewers apply different
12
12
  lenses to the same change. Report only findings supported by your own lenses.
@@ -235,6 +235,13 @@ while : ; do
235
235
  }
236
236
  }')
237
237
  echo "$PAGE" # collect nodes from every page before deciding the PR is clean
238
+ # GitHub GraphQL returns transient 502/504s (no .data). An empty page reads as
239
+ # "no next page", so retry it a bounded number of times instead of treating it as clean.
240
+ if ! echo "$PAGE" | jq -e '.data' >/dev/null 2>&1; then
241
+ RETRIES=$(( ${RETRIES:-0} + 1 ))
242
+ [ "$RETRIES" -le 3 ] || { echo "GraphQL still failing after 3 retries; threads unknown, not clean"; exit 1; }
243
+ sleep 5; continue
244
+ fi
238
245
  PI='.data.repository.pullRequest.reviewThreads.pageInfo'
239
246
  [ "$(echo "$PAGE" | jq -r "$PI.hasNextPage")" = "true" ] || break
240
247
  CURSOR=$(echo "$PAGE" | jq -r "$PI.endCursor")
@@ -235,6 +235,13 @@ while : ; do
235
235
  }
236
236
  }')
237
237
  echo "$PAGE" # collect nodes from every page before deciding the PR is clean
238
+ # GitHub GraphQL returns transient 502/504s (no .data). An empty page reads as
239
+ # "no next page", so retry it a bounded number of times instead of treating it as clean.
240
+ if ! echo "$PAGE" | jq -e '.data' >/dev/null 2>&1; then
241
+ RETRIES=$(( ${RETRIES:-0} + 1 ))
242
+ [ "$RETRIES" -le 3 ] || { echo "GraphQL still failing after 3 retries; threads unknown, not clean"; exit 1; }
243
+ sleep 5; continue
244
+ fi
238
245
  PI='.data.repository.pullRequest.reviewThreads.pageInfo'
239
246
  [ "$(echo "$PAGE" | jq -r "$PI.hasNextPage")" = "true" ] || break
240
247
  CURSOR=$(echo "$PAGE" | jq -r "$PI.endCursor")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@olegkoval/agent-skills",
3
- "version": "1.51.0",
3
+ "version": "1.51.1",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-apple-kit",
3
3
  "description": "Build and ship Apple platform apps: macOS menubar apps, App Store submissions.",
4
- "version": "1.51.0",
4
+ "version": "1.51.1",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-creative",
3
3
  "description": "Creative and personal projects: photo galleries, music players, listings, wiki editing.",
4
- "version": "1.51.0",
4
+ "version": "1.51.1",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-garmin-kit",
3
3
  "description": "Build, test and publish Garmin Connect IQ watch faces.",
4
- "version": "1.51.0",
4
+ "version": "1.51.1",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-git-tools",
3
3
  "description": "Everyday git and GitHub CLI operations: conventional commits, branch hygiene.",
4
- "version": "1.51.0",
4
+ "version": "1.51.1",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-github-pr",
3
3
  "description": "Drive GitHub pull requests to merge-ready: review-bot loops, CI fixes, descriptions, dependency triage.",
4
- "version": "1.51.0",
4
+ "version": "1.51.1",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -234,6 +234,13 @@ while : ; do
234
234
  }
235
235
  }')
236
236
  echo "$PAGE" # collect nodes from every page before deciding the PR is clean
237
+ # GitHub GraphQL returns transient 502/504s (no .data). An empty page reads as
238
+ # "no next page", so retry it a bounded number of times instead of treating it as clean.
239
+ if ! echo "$PAGE" | jq -e '.data' >/dev/null 2>&1; then
240
+ RETRIES=$(( ${RETRIES:-0} + 1 ))
241
+ [ "$RETRIES" -le 3 ] || { echo "GraphQL still failing after 3 retries; threads unknown, not clean"; exit 1; }
242
+ sleep 5; continue
243
+ fi
237
244
  PI='.data.repository.pullRequest.reviewThreads.pageInfo'
238
245
  [ "$(echo "$PAGE" | jq -r "$PI.hasNextPage")" = "true" ] || break
239
246
  CURSOR=$(echo "$PAGE" | jq -r "$PI.endCursor")
@@ -228,7 +228,11 @@ Input tokens: ~<N> ← estimated: diff tokens × agent passes + context fil
228
228
  Cost: ~$<X.XX> (output actual, input estimated; blended across model tiers below)
229
229
  ```
230
230
 
231
- Per-MTok pricing (input/output), verified 2026-07-07 from the claude-api reference; re-check there if models changed:
231
+ Per-MTok pricing (input/output), verified 2026-07-07 from the claude-api reference; re-check there if models changed. The Claude 5.5 rows and fable-5-1 are not yet on that sheet: they reuse the predecessor-tier rates and must be re-checked:
232
+ - claude-fable-5-1: $10 / $50 (unverified, as claude-fable-5)
233
+ - claude-opus-5-5: $15 / $75 (unverified; copied from the opus-5 rate in pricing.json, not checked)
234
+ - claude-sonnet-5-5: $3 / $15 (unverified)
235
+ - claude-haiku-5-5: $1 / $5 (unverified)
232
236
  - claude-fable-5: $10 / $50
233
237
  - claude-opus-4-8: $5 / $25
234
238
  - claude-sonnet-4-6 / claude-sonnet-5: $3 / $15
@@ -1,5 +1,9 @@
1
1
  {
2
- "note": "USD per million tokens, keyed by revmux's actual_model. revmux runs `claude --print` under subscription (Max plan) auth, so nothing here is a real API bill; this is an API-list-price ESTIMATE for the cost block only. Where a model exposes separate input/output prices, usd = tokens/1e6 * output price (output-only, not blended), because revmux reports a single combined `tokens` figure per agent with no input/output split to weight a blend. verified:false entries are not confirmed against a current price sheet (no local claude-api pricing doc found on this machine as of 2026-09-09) and must be checked before this cost block is trusted for a real decision.",
2
+ "note": "USD per million tokens, keyed by revmux's actual_model. revmux runs `claude --print` under subscription (Max plan) auth, so nothing here is a real API bill; this is an API-list-price ESTIMATE for the cost block only. Where a model exposes separate input/output prices, usd = tokens/1e6 * output price (output-only, not blended), because revmux reports a single combined `tokens` figure per agent with no input/output split to weight a blend. verified:false entries are not confirmed against a current price sheet (no local claude-api pricing doc found on this machine as of 2026-09-09) and must be checked before this cost block is trusted for a real decision. The claude-*-5-5 and claude-fable-5-1 rows carry the prices of their predecessor tier (fable: $10/$50 as listed in output-format.md; opus/sonnet/haiku: the 5-family rates above) until a price sheet confirms the new models.",
3
+ "claude-fable-5-1": { "input": 10, "output": 50, "blended": 30, "verified": false },
4
+ "claude-opus-5-5": { "input": 15, "output": 75, "blended": 45, "verified": false },
5
+ "claude-sonnet-5-5": { "input": 3, "output": 15, "blended": 9, "verified": false },
6
+ "claude-haiku-5-5": { "input": 1, "output": 5, "blended": 3, "verified": false },
3
7
  "claude-opus-5": { "input": 15, "output": 75, "blended": 45, "verified": false },
4
8
  "claude-sonnet-5": { "input": 3, "output": 15, "blended": 9, "verified": false },
5
9
  "claude-haiku-4-5-20251001": { "input": 1, "output": 5, "blended": 3, "verified": false },
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  description: Deep lekker review using Codex agents and a second implementation pass
3
- model: codex/gpt-5.6-sol:high
3
+ model: codex/gpt-6-astra:high
4
4
  agents:
5
5
  - {name: quality+impl, lenses: [lekker-quality, lekker-implementation], color: cyan}
6
6
  - {name: simpl+conventions, lenses: [lekker-simplification, lekker-conventions], color: magenta}
7
7
  - {name: tests, lenses: [lekker-test-quality, tests], color: green}
8
8
  - {name: adversarial, lenses: [adversarial], color: yellow}
9
9
  - {name: bugs+impl, lenses: [bugs, impl], color: blue}
10
- stages: {synthesis: codex/gpt-5.6-sol:high, verify: codex/gpt-5.6-sol:high}
10
+ stages: {synthesis: codex/gpt-6-astra:high, verify: codex/gpt-6-astra:high}
11
11
  ---
12
12
  You are one read-only reviewer on a panel. Other reviewers apply different
13
13
  lenses to the same change. Report only findings supported by your own lenses.
@@ -1,12 +1,12 @@
1
1
  ---
2
2
  description: Medium-depth lekker review using Codex agents
3
- model: codex/gpt-5.6-sol:high
3
+ model: codex/gpt-6-astra:high
4
4
  agents:
5
5
  - {name: quality+impl, lenses: [lekker-quality, lekker-implementation], color: cyan}
6
6
  - {name: simpl+conventions, lenses: [lekker-simplification, lekker-conventions], color: magenta}
7
7
  - {name: tests, lenses: [lekker-test-quality, tests], color: green}
8
8
  - {name: adversarial, lenses: [adversarial], color: yellow}
9
- stages: {synthesis: codex/gpt-5.6-sol:high, verify: codex/gpt-5.6-sol:high}
9
+ stages: {synthesis: codex/gpt-6-astra:high, verify: codex/gpt-6-astra:high}
10
10
  ---
11
11
  You are one read-only reviewer on a panel. Other reviewers apply different
12
12
  lenses to the same change. Report only findings supported by your own lenses.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-obsidian",
3
3
  "description": "Keep an Obsidian vault in sync with work: PR sync, task rollover, morning routine.",
4
- "version": "1.51.0",
4
+ "version": "1.51.1",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-product",
3
3
  "description": "Take a product idea to a shippable build: MVP passes, full-stack scaffolds, UX/UI quality loops, launch plans.",
4
- "version": "1.51.0",
4
+ "version": "1.51.1",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-reflection",
3
3
  "description": "Look back and improve: self-critique, retrospectives, performance review, rapid learning.",
4
- "version": "1.51.0",
4
+ "version": "1.51.1",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-release",
3
3
  "description": "Ship a release: semantic-release setup, changelogs, store listing copy, release-day routine.",
4
- "version": "1.51.0",
4
+ "version": "1.51.1",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-skill-meta",
3
3
  "description": "Author and maintain agent skills and the AI toolchain itself.",
4
- "version": "1.51.0",
4
+ "version": "1.51.1",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "olko-web-ops",
3
3
  "description": "Operate a website: WAF rules, search console audits, analytics bootstrap, docs indexes.",
4
- "version": "1.51.0",
4
+ "version": "1.51.1",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },