@olegkoval/agent-skills 1.19.1 → 1.21.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 (110) hide show
  1. package/.claude-plugin/plugin.json +4 -2
  2. package/.cursor-plugin/index.json +10 -0
  3. package/.grok-plugin/index.json +10 -0
  4. package/.kiro/steering/coderabbitloop.md +109 -0
  5. package/.kiro/steering/garmin-watchface.md +201 -0
  6. package/.windsurf/rules/coderabbitloop.md +108 -0
  7. package/.windsurf/rules/garmin-watchface.md +200 -0
  8. package/README.md +8 -1
  9. package/catalog/skills.json +52 -4
  10. package/collections/wearables.json +7 -0
  11. package/package.json +1 -1
  12. package/packages/marketing/viral-launch/adapters/claude/skills/viral-launch/references/external-skills.md +12 -0
  13. package/packages/marketing/viral-launch/adapters/claude/skills/viral-launch/references/launch-checklist.md +42 -0
  14. package/packages/marketing/viral-launch/adapters/cursor/skills/viral-launch/references/external-skills.md +12 -0
  15. package/packages/marketing/viral-launch/adapters/cursor/skills/viral-launch/references/launch-checklist.md +42 -0
  16. package/packages/marketing/viral-launch/adapters/grok/skills/viral-launch/references/external-skills.md +12 -0
  17. package/packages/marketing/viral-launch/adapters/grok/skills/viral-launch/references/launch-checklist.md +42 -0
  18. package/packages/software-development/coderabbitloop/SKILL.md +117 -0
  19. package/packages/software-development/coderabbitloop/adapters/claude/plugin.json +5 -0
  20. package/packages/software-development/coderabbitloop/adapters/claude/skills/coderabbitloop/SKILL.md +118 -0
  21. package/packages/software-development/coderabbitloop/adapters/claude/skills/coderabbitloop/references/graphql-queries.md +101 -0
  22. package/packages/software-development/coderabbitloop/adapters/codex/README.md +20 -0
  23. package/packages/software-development/coderabbitloop/adapters/cursor/plugin.json +6 -0
  24. package/packages/software-development/coderabbitloop/adapters/cursor/skills/coderabbitloop/SKILL.md +119 -0
  25. package/packages/software-development/coderabbitloop/adapters/cursor/skills/coderabbitloop/references/graphql-queries.md +101 -0
  26. package/packages/software-development/coderabbitloop/adapters/grok/plugin.json +6 -0
  27. package/packages/software-development/coderabbitloop/adapters/grok/skills/coderabbitloop/SKILL.md +118 -0
  28. package/packages/software-development/coderabbitloop/adapters/grok/skills/coderabbitloop/references/graphql-queries.md +101 -0
  29. package/packages/software-development/coderabbitloop/adapters/kiro/steering/coderabbitloop.md +109 -0
  30. package/packages/software-development/coderabbitloop/adapters/windsurf/rules/coderabbitloop.md +108 -0
  31. package/packages/software-development/coderabbitloop/references/graphql-queries.md +101 -0
  32. package/packages/software-development/qodoloop/adapters/claude/skills/qodoloop/references/graphql-queries.md +151 -0
  33. package/packages/software-development/qodoloop/adapters/cursor/skills/qodoloop/references/graphql-queries.md +151 -0
  34. package/packages/software-development/qodoloop/adapters/grok/skills/qodoloop/references/graphql-queries.md +151 -0
  35. package/packages/software-development/semantic-release-beta/adapters/claude/skills/semantic-release-beta/references/github-actions.md +16 -0
  36. package/packages/software-development/semantic-release-beta/adapters/claude/skills/semantic-release-beta/references/node-semantic-release.md +13 -0
  37. package/packages/software-development/semantic-release-beta/adapters/claude/skills/semantic-release-beta/references/preset.md +47 -0
  38. package/packages/software-development/semantic-release-beta/adapters/claude/skills/semantic-release-beta/references/validation.md +17 -0
  39. package/packages/software-development/semantic-release-beta/adapters/cursor/skills/semantic-release-beta/references/github-actions.md +16 -0
  40. package/packages/software-development/semantic-release-beta/adapters/cursor/skills/semantic-release-beta/references/node-semantic-release.md +13 -0
  41. package/packages/software-development/semantic-release-beta/adapters/cursor/skills/semantic-release-beta/references/preset.md +47 -0
  42. package/packages/software-development/semantic-release-beta/adapters/cursor/skills/semantic-release-beta/references/validation.md +17 -0
  43. package/packages/software-development/semantic-release-beta/adapters/grok/skills/semantic-release-beta/references/github-actions.md +16 -0
  44. package/packages/software-development/semantic-release-beta/adapters/grok/skills/semantic-release-beta/references/node-semantic-release.md +13 -0
  45. package/packages/software-development/semantic-release-beta/adapters/grok/skills/semantic-release-beta/references/preset.md +47 -0
  46. package/packages/software-development/semantic-release-beta/adapters/grok/skills/semantic-release-beta/references/validation.md +17 -0
  47. package/packages/wearables/garmin-watchface/SKILL.md +204 -0
  48. package/packages/wearables/garmin-watchface/adapters/claude/plugin.json +5 -0
  49. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/SKILL.md +205 -0
  50. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/references/devices.md +98 -0
  51. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/references/display.md +120 -0
  52. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/references/layout.md +224 -0
  53. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/references/simulator.md +146 -0
  54. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/references/store.md +151 -0
  55. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/references/testing.md +154 -0
  56. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/scripts/ciq-calibrate +184 -0
  57. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/scripts/ciq-capture +215 -0
  58. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/scripts/ciq-devices +177 -0
  59. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/scripts/ciq-doctor +85 -0
  60. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/templates/Makefile +72 -0
  61. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/templates/monkey.jungle +13 -0
  62. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/templates/monkey.test.jungle +7 -0
  63. package/packages/wearables/garmin-watchface/adapters/codex/README.md +3 -0
  64. package/packages/wearables/garmin-watchface/adapters/cursor/plugin.json +6 -0
  65. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/SKILL.md +205 -0
  66. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/references/devices.md +98 -0
  67. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/references/display.md +120 -0
  68. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/references/layout.md +224 -0
  69. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/references/simulator.md +146 -0
  70. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/references/store.md +151 -0
  71. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/references/testing.md +154 -0
  72. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/scripts/ciq-calibrate +184 -0
  73. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/scripts/ciq-capture +215 -0
  74. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/scripts/ciq-devices +177 -0
  75. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/scripts/ciq-doctor +85 -0
  76. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/templates/Makefile +72 -0
  77. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/templates/monkey.jungle +13 -0
  78. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/templates/monkey.test.jungle +7 -0
  79. package/packages/wearables/garmin-watchface/adapters/grok/plugin.json +6 -0
  80. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/SKILL.md +205 -0
  81. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/references/devices.md +98 -0
  82. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/references/display.md +120 -0
  83. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/references/layout.md +224 -0
  84. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/references/simulator.md +146 -0
  85. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/references/store.md +151 -0
  86. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/references/testing.md +154 -0
  87. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/scripts/ciq-calibrate +184 -0
  88. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/scripts/ciq-capture +215 -0
  89. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/scripts/ciq-devices +177 -0
  90. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/scripts/ciq-doctor +85 -0
  91. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/templates/Makefile +72 -0
  92. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/templates/monkey.jungle +13 -0
  93. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/templates/monkey.test.jungle +7 -0
  94. package/packages/wearables/garmin-watchface/adapters/kiro/steering/garmin-watchface.md +201 -0
  95. package/packages/wearables/garmin-watchface/adapters/windsurf/rules/garmin-watchface.md +200 -0
  96. package/packages/wearables/garmin-watchface/references/devices.md +98 -0
  97. package/packages/wearables/garmin-watchface/references/display.md +120 -0
  98. package/packages/wearables/garmin-watchface/references/layout.md +224 -0
  99. package/packages/wearables/garmin-watchface/references/simulator.md +146 -0
  100. package/packages/wearables/garmin-watchface/references/store.md +151 -0
  101. package/packages/wearables/garmin-watchface/references/testing.md +154 -0
  102. package/packages/wearables/garmin-watchface/scripts/ciq-calibrate +184 -0
  103. package/packages/wearables/garmin-watchface/scripts/ciq-capture +215 -0
  104. package/packages/wearables/garmin-watchface/scripts/ciq-devices +177 -0
  105. package/packages/wearables/garmin-watchface/scripts/ciq-doctor +85 -0
  106. package/packages/wearables/garmin-watchface/templates/Makefile +72 -0
  107. package/packages/wearables/garmin-watchface/templates/monkey.jungle +13 -0
  108. package/packages/wearables/garmin-watchface/templates/monkey.test.jungle +7 -0
  109. package/scripts/build-adapters.sh +1 -1
  110. package/scripts/validate-catalog.sh +2 -1
@@ -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.19.0",
4
+ "version": "1.20.0",
5
5
  "author": {
6
6
  "name": "Oleg Koval"
7
7
  },
@@ -32,6 +32,8 @@
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/qodoloop"
35
+ "./packages/software-development/qodoloop",
36
+ "./packages/wearables/garmin-watchface",
37
+ "./packages/software-development/coderabbitloop"
36
38
  ]
37
39
  }
@@ -110,6 +110,16 @@
110
110
  "name": "olko:qodoloop",
111
111
  "source": "./packages/software-development/qodoloop/adapters/cursor",
112
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."
113
+ },
114
+ {
115
+ "name": "olko:garmin-watchface",
116
+ "source": "./packages/wearables/garmin-watchface/adapters/cursor",
117
+ "description": "Build, test, screenshot and publish Garmin Connect IQ watch faces in Monkey C."
118
+ },
119
+ {
120
+ "name": "olko:coderabbitloop",
121
+ "source": "./packages/software-development/coderabbitloop/adapters/cursor",
122
+ "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."
113
123
  }
114
124
  ]
115
125
  }
@@ -120,6 +120,16 @@
120
120
  "name": "olko:qodoloop",
121
121
  "source": "./packages/software-development/qodoloop/adapters/grok",
122
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
+ "name": "olko:garmin-watchface",
126
+ "source": "./packages/wearables/garmin-watchface/adapters/grok",
127
+ "description": "Build, test, screenshot and publish Garmin Connect IQ watch faces in Monkey C."
128
+ },
129
+ {
130
+ "name": "olko:coderabbitloop",
131
+ "source": "./packages/software-development/coderabbitloop/adapters/grok",
132
+ "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."
123
133
  }
124
134
  ]
125
135
  }
@@ -0,0 +1,109 @@
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 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."
6
+ ---
7
+
8
+ # Coderabbitloop
9
+
10
+ Fix every actionable CodeRabbit finding on a PR, answer each thread, resolve it, and keep going until CodeRabbit 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
+
16
+ ## How CodeRabbit actually posts (verified against docs.coderabbit.ai and a live install — don't assume otherwise)
17
+
18
+ CodeRabbit runs as `coderabbitai[bot]` and posts **two independent things**, not one:
19
+
20
+ 1. An auto-generated **walkthrough/summary issue comment** — body starts with the HTML marker `<!-- This is an auto-generated comment: summarize by coderabbit.ai -->`. This is a description, not a review — use it for context only, never as a source of fixable findings.
21
+ 2. A **formal PR review** carrying one **inline review comment per finding**, each a real, resolvable GitHub review thread at the finding's file/line. Each one contains a `<details><summary>🤖 Prompt for AI Agents</summary>` block: a ready-made fix spec, CodeRabbit's own words, meant to be handed straight to an agent.
22
+
23
+ **Use the inline threads as the source of truth**, exactly like Greptile/Qodo — fetch via GraphQL `reviewThreads`, which carries native `isResolved` state (see `references/graphql-queries.md`, shared with `qodoloop`; only the bot login and the prompt-heading text differ).
24
+
25
+ CodeRabbit has slash commands (official, `docs.coderabbit.ai/reference/review-commands`) — the ones this loop actually uses:
26
+ - `@coderabbitai review` — incremental review of new changes (use this to re-trigger after a push, if automatic review-on-push is off for this repo).
27
+ - `@coderabbitai resolve` — marks **all** CodeRabbit threads resolved in one shot. This is a bulk escape hatch, not the default path: this loop resolves threads one at a time, right after replying to each, so the reply-then-resolve record stays intact per finding.
28
+ - CodeRabbit also has its own built-in `@coderabbitai autofix`, which commits fixes directly without a model in the loop. Mention it to the user as an alternative if they'd rather skip the loop entirely, but this skill's whole point is the Claude-orchestrated version — don't default to autofix instead of doing the work.
29
+
30
+ **Rate limit is a real terminal state, not a bug.** A comment reading "you've reached your PR review limit" (confirmed live wording) means CodeRabbit will not review again this cycle — stop and report it, don't loop waiting for something that isn't coming.
31
+
32
+ ## Instructions
33
+
34
+ ### 1. Identify the PR
35
+
36
+ ```bash
37
+ gh pr view --json number,headRefName,headRefOid -q '{number, branch: .headRefName, sha: .headRefOid}'
38
+ ```
39
+
40
+ Check out the branch if not already on it.
41
+
42
+ ### 2. Loop (max 5 iterations)
43
+
44
+ #### A. Push and wait
45
+
46
+ ```bash
47
+ git push
48
+ ```
49
+
50
+ If this repo doesn't auto-review on push, nudge it:
51
+
52
+ ```bash
53
+ gh pr comment <PR_NUMBER> --body "@coderabbitai review"
54
+ ```
55
+
56
+ Poll (every ~10s, timeout ~5min) for CodeRabbit's next formal review to land — a new entry in `gh api repos/{owner}/{repo}/pulls/<PR_NUMBER>/reviews` from `coderabbitai[bot]` created after this push. If you instead see a rate-limit comment ("review limit"), **stop the loop now** and go to Report with `blocked: rate-limited`.
57
+
58
+ #### B. Fetch unresolved findings
59
+
60
+ Run the `unresolvedQodoThreads`-shaped query in `references/graphql-queries.md` (filter `author.login == "coderabbitai[bot]"` instead of Qodo's login). For each unresolved thread, parse the finding text and the **Prompt for AI Agents** block (heading text is `🤖 Prompt for AI Agents`, not `Agent Prompt` — match case/emoji-insensitively).
61
+
62
+ #### C. Check exit conditions
63
+
64
+ Stop if there are zero unresolved CodeRabbit threads, or max iterations reached.
65
+
66
+ #### D. Fix each finding
67
+
68
+ For each thread, in order: read the Prompt for AI Agents block in full — it names the issue and the fix. Apply it, staying inside its stated scope. If the suggestion is wrong, unsafe, or needs a product decision, don't force it — note that in step E instead.
69
+
70
+ #### E. Answer and resolve
71
+
72
+ **Reply to the thread first, then resolve it** — the "answer to the comments" half of the job:
73
+
74
+ ```bash
75
+ gh api graphql -f query='mutation { addPullRequestReviewThreadReply(input: {pullRequestReviewThreadId: "<THREAD_ID>", body: "<REPLY>"}) { comment { id } } }'
76
+ ```
77
+
78
+ Reply body: one or two sentences — what you changed and why, or exactly why you didn't fix it. Then resolve (`resolveReviewThread`). A finding you deliberately skip still gets a reply and gets resolved.
79
+
80
+ #### F. Commit and push
81
+
82
+ ```bash
83
+ git add -A
84
+ git commit -m "address CodeRabbit review feedback (coderabbitloop iteration N)"
85
+ git push
86
+ ```
87
+
88
+ Go back to step A.
89
+
90
+ ### 3. Report
91
+
92
+ | Field | Value |
93
+ |--------------------|-------|
94
+ | Iterations | N |
95
+ | Findings resolved | N |
96
+ | Findings skipped | N (with reasons) |
97
+ | Remaining | N (if any) |
98
+ | Blocked | rate-limited / max-iterations / none |
99
+
100
+ ```
101
+ Coderabbitloop complete.
102
+ Iterations: 2
103
+ Resolved: 4 (3 fixed, 1 false-positive, replied + resolved)
104
+ Remaining: 0
105
+ ```
106
+
107
+ ## References
108
+
109
+ - `references/graphql-queries.md` — shared with `qodoloop`: the exact `reviewThreads` query and the `resolveReviewThread` / `addPullRequestReviewThreadReply` mutations. Swap the author-login filter to `coderabbitai[bot]` and the prompt-heading match to `Prompt for AI Agents`.
@@ -0,0 +1,201 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ ---
4
+ inclusion: manual
5
+ description: "Build, test, screenshot and publish Garmin Connect IQ watch faces in Monkey C."
6
+ ---
7
+
8
+ # Garmin Connect IQ watch faces
9
+
10
+ Monkey C gives you almost no safety net. The compiler is happy to build a face
11
+ that draws off the bottom of the screen, a test suite that contains no tests, and
12
+ a colour that is not the colour you get. Everything below is a failure mode that
13
+ looked like success first.
14
+
15
+ **Read `references/` files as needed — do not read them all up front.**
16
+
17
+ | File | When |
18
+ | --- | --- |
19
+ | `references/display.md` | Choosing colours, anything about brightness or legibility |
20
+ | `references/layout.md` | Positioning anything; content clipped, overlapping, or off-screen |
21
+ | `references/testing.md` | Writing tests; a suspiciously clean test run |
22
+ | `references/simulator.md` | Screenshots, settings not applying, monkeydo hanging |
23
+ | `references/devices.md` | Adding device support, launcher icons, API levels |
24
+ | `references/store.md` | Publishing, listing copy, IP questions |
25
+
26
+ ## Tools
27
+
28
+ Run these rather than reinventing them. All are standalone.
29
+
30
+ ```bash
31
+ <skill-dir>/scripts/ciq-doctor # toolchain check: SDK, JDK, key, devices
32
+ <skill-dir>/scripts/ciq-devices # survey installed devices by resolution
33
+ <skill-dir>/scripts/ciq-devices --same-as fenix6pro # products you can add with no code change
34
+ <skill-dir>/scripts/ciq-capture out.png # calibrated simulator screenshot
35
+ <skill-dir>/scripts/ciq-capture out.png --face --size 260 # cropped + masked to the round display
36
+ <skill-dir>/scripts/ciq-calibrate # re-derive the display rect if capture looks wrong
37
+ ```
38
+
39
+ `<skill-dir>/scripts/ciq-capture` exists because `screencapture -R` grabs a screen *region*, not
40
+ a window: without a frontmost check it silently photographs whatever is on top,
41
+ and the window moves between simulator restarts. Both failure modes produce a
42
+ plausible PNG of the wrong thing.
43
+
44
+ ## The five things that will bite you
45
+
46
+ ### 1. `make test` can compile zero tests and report success
47
+
48
+ If `monkey.jungle` sets `base.excludeAnnotations = test`, every `(:test)`
49
+ function is stripped from **every** target, including the unit-test build. You
50
+ get `BUILD SUCCESSFUL` and a green run with nothing compiled — even when the test
51
+ files reference symbols that no longer exist.
52
+
53
+ Fix: a second jungle passed as an additional `-f`. See
54
+ `<skill-dir>/templates/monkey.test.jungle` and the `test` target in `<skill-dir>/templates/Makefile`.
55
+
56
+ **Prove it before you trust it.** Put a deliberately unresolvable symbol in one
57
+ test and confirm the build fails:
58
+
59
+ ```monkeyc
60
+ return ThisDoesNotExist.definitelyNotAFunction();
61
+ ```
62
+
63
+ ### 2. Never hardcode a Y coordinate or assume a font height
64
+
65
+ `dc.getFontHeight()` is the only source of truth, and the numbers are larger than
66
+ they look. Measured on fenix 6 Pro:
67
+
68
+ | Font | Height |
69
+ | --- | --- |
70
+ | `FONT_XTINY` | 19 |
71
+ | `FONT_TINY` | 29 |
72
+ | `FONT_SMALL` | 32 |
73
+ | `FONT_NUMBER_MEDIUM` | 74 |
74
+
75
+ Content drawn past the screen height is simply invisible — no error, no warning,
76
+ no clipping indicator. A two-line `FONT_NUMBER_MEDIUM` block is 148px of a 260px
77
+ face.
78
+
79
+ Derive every Y at draw time, and **clamp** so a bottom row cannot be pushed off:
80
+
81
+ ```monkeyc
82
+ function clampRuleY(derived as Number, footerH as Number) as Number {
83
+ var reserved = (footerH * 2) + GAP_BELOW_RULE + GAP_BETWEEN_ROWS;
84
+ var maxRuleY = SCREEN - BOTTOM_MARGIN - reserved;
85
+ return derived > maxRuleY ? maxRuleY : derived;
86
+ }
87
+ ```
88
+
89
+ See `references/layout.md`.
90
+
91
+ ### 3. The screen is round; your layout is not
92
+
93
+ Check content against the bezel curve, not the bounding square. A rectangle
94
+ inscribed in a circle fails at its **corners** long before its sides.
95
+
96
+ ```monkeyc
97
+ function halfWidthAt(y as Number) as Number {
98
+ var dy = y - CENTER;
99
+ var inside = (CENTER * CENTER) - (dy * dy);
100
+ return inside <= 0 ? 0 : Math.sqrt(inside).toNumber();
101
+ }
102
+ ```
103
+
104
+ ### 4. Colours are quantised, and brightness is reflectance
105
+
106
+ Many devices snap to a 4×4×4 lattice: `0x00 / 0x55 / 0xAA / 0xFF` per channel. A
107
+ colour not already on it is not the colour that ships.
108
+
109
+ More important: MIP screens are **transflective with no backlight**. A colour's
110
+ brightness *is* how much ambient light it returns. Grey reflects about two-thirds
111
+ of what white does. Choosing a photographically accurate grey for a large area
112
+ makes the whole face read as dim on the wrist while looking fine in the
113
+ simulator's backlit LCD.
114
+
115
+ Corollary: a saturated colour on a glyph reflects only its own channel, making
116
+ the thing you want to read the *dimmest* thing on screen.
117
+
118
+ See `references/display.md`.
119
+
120
+ ### 5. The simulator lies about settings
121
+
122
+ It persists app settings and **ignores changed defaults in `properties.xml`**
123
+ until you do File → Reset All App Data. A property will keep reading its old
124
+ value while the XML plainly says otherwise. This looks exactly like broken
125
+ settings code.
126
+
127
+ Reset also drops the loaded device, so relaunch and re-push afterwards.
128
+
129
+ See `references/simulator.md`.
130
+
131
+ ## Workflow
132
+
133
+ ### Starting a face
134
+
135
+ 1. `<skill-dir>/scripts/ciq-doctor` — confirm SDK, JDK, developer key, target device installed.
136
+ 2. Copy `<skill-dir>/templates/Makefile`, `<skill-dir>/templates/monkey.jungle`, `<skill-dir>/templates/monkey.test.jungle`.
137
+ 3. Generate a fresh app id: `python3 -c "import uuid;print(uuid.uuid4().hex)"`.
138
+ 4. Split source by responsibility. This structure has held up well:
139
+
140
+ | Module | Holds |
141
+ | --- | --- |
142
+ | `Palette.mc` | Colours only, all lattice-exact |
143
+ | `Layout.mc` | Geometry, derivations, bezel maths — no drawing |
144
+ | `<Widget>.mc` | Drawing primitives (rows, bars, segments) |
145
+ | `Fields.mc` | Formatting and thresholds — pure, easy to test |
146
+ | `Sensors.mc` | Sensor reads with null handling |
147
+ | `<Name>View.mc` | Composition only |
148
+
149
+ Keeping `Layout` free of `Dc` calls is what makes geometry unit-testable.
150
+
151
+ ### Every change
152
+
153
+ ```bash
154
+ make build && make test && make lint
155
+ ```
156
+
157
+ `make lint` is level 3 and catches real problems the level 2 build allows.
158
+
159
+ ### Before committing
160
+
161
+ Capture and *look at it*. Layout bugs are invisible in a passing test run:
162
+
163
+ ```bash
164
+ make build && make sim
165
+ <skill-dir>/scripts/ciq-capture /tmp/face.png --face --size 260
166
+ ```
167
+
168
+ Then Read the PNG. Every layout bug in this skill's history was found by looking,
169
+ not by testing.
170
+
171
+ ## Monkey C gotchas
172
+
173
+ - Module-level functions take **no** visibility modifier. `private` and `hidden`
174
+ are class-only; at module scope they are syntax errors.
175
+ - `dc.fillPolygon` wants `Array<[Numeric, Numeric]>`. Cast the literal:
176
+ `[[x, y], ...] as Array<[Numeric, Numeric]>`.
177
+ - `getInitialView()` returns
178
+ `[WatchUi.Views] or [WatchUi.Views, WatchUi.InputDelegates]`.
179
+ - `Application.Properties.getValue()` **throws** when a key is absent, which
180
+ happens on a fresh install before settings have ever been written. Wrap every
181
+ read with a default.
182
+ - Integer division everywhere. Centring an odd width leaves a 1px skew — write
183
+ tests that allow it rather than forcing constants to stay even.
184
+
185
+ ## Reference watches and homages
186
+
187
+ If reproducing a real object, get these right before anything else, because they
188
+ are what makes it recognisable:
189
+
190
+ - **Display polarity.** A 1970s LCD is *positive*: dark segments on a pale panel,
191
+ the inverse of every modern face. Getting this backwards turns a crystal into a
192
+ screen.
193
+ - **Proportion.** Bezels on vintage digitals are thick; the window is smaller
194
+ than memory suggests.
195
+ - **Where the legends sit** — maker's name on the bezel, not the glass.
196
+
197
+ No system font is a segment display. If you need one, draw it: see
198
+ `references/layout.md` for a working seven-segment renderer, including the ghost
199
+ (unlit) segments that are most of what sells the effect.
200
+
201
+ **Do not print a real brand on the face.** See `references/store.md`.
@@ -0,0 +1,108 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ ---
4
+ 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."
5
+ ---
6
+
7
+ # Coderabbitloop
8
+
9
+ Fix every actionable CodeRabbit finding on a PR, answer each thread, resolve it, and keep going until CodeRabbit 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
+
15
+ ## How CodeRabbit actually posts (verified against docs.coderabbit.ai and a live install — don't assume otherwise)
16
+
17
+ CodeRabbit runs as `coderabbitai[bot]` and posts **two independent things**, not one:
18
+
19
+ 1. An auto-generated **walkthrough/summary issue comment** — body starts with the HTML marker `<!-- This is an auto-generated comment: summarize by coderabbit.ai -->`. This is a description, not a review — use it for context only, never as a source of fixable findings.
20
+ 2. A **formal PR review** carrying one **inline review comment per finding**, each a real, resolvable GitHub review thread at the finding's file/line. Each one contains a `<details><summary>🤖 Prompt for AI Agents</summary>` block: a ready-made fix spec, CodeRabbit's own words, meant to be handed straight to an agent.
21
+
22
+ **Use the inline threads as the source of truth**, exactly like Greptile/Qodo — fetch via GraphQL `reviewThreads`, which carries native `isResolved` state (see `references/graphql-queries.md`, shared with `qodoloop`; only the bot login and the prompt-heading text differ).
23
+
24
+ CodeRabbit has slash commands (official, `docs.coderabbit.ai/reference/review-commands`) — the ones this loop actually uses:
25
+ - `@coderabbitai review` — incremental review of new changes (use this to re-trigger after a push, if automatic review-on-push is off for this repo).
26
+ - `@coderabbitai resolve` — marks **all** CodeRabbit threads resolved in one shot. This is a bulk escape hatch, not the default path: this loop resolves threads one at a time, right after replying to each, so the reply-then-resolve record stays intact per finding.
27
+ - CodeRabbit also has its own built-in `@coderabbitai autofix`, which commits fixes directly without a model in the loop. Mention it to the user as an alternative if they'd rather skip the loop entirely, but this skill's whole point is the Claude-orchestrated version — don't default to autofix instead of doing the work.
28
+
29
+ **Rate limit is a real terminal state, not a bug.** A comment reading "you've reached your PR review limit" (confirmed live wording) means CodeRabbit will not review again this cycle — stop and report it, don't loop waiting for something that isn't coming.
30
+
31
+ ## Instructions
32
+
33
+ ### 1. Identify the PR
34
+
35
+ ```bash
36
+ gh pr view --json number,headRefName,headRefOid -q '{number, branch: .headRefName, sha: .headRefOid}'
37
+ ```
38
+
39
+ Check out the branch if not already on it.
40
+
41
+ ### 2. Loop (max 5 iterations)
42
+
43
+ #### A. Push and wait
44
+
45
+ ```bash
46
+ git push
47
+ ```
48
+
49
+ If this repo doesn't auto-review on push, nudge it:
50
+
51
+ ```bash
52
+ gh pr comment <PR_NUMBER> --body "@coderabbitai review"
53
+ ```
54
+
55
+ Poll (every ~10s, timeout ~5min) for CodeRabbit's next formal review to land — a new entry in `gh api repos/{owner}/{repo}/pulls/<PR_NUMBER>/reviews` from `coderabbitai[bot]` created after this push. If you instead see a rate-limit comment ("review limit"), **stop the loop now** and go to Report with `blocked: rate-limited`.
56
+
57
+ #### B. Fetch unresolved findings
58
+
59
+ Run the `unresolvedQodoThreads`-shaped query in `references/graphql-queries.md` (filter `author.login == "coderabbitai[bot]"` instead of Qodo's login). For each unresolved thread, parse the finding text and the **Prompt for AI Agents** block (heading text is `🤖 Prompt for AI Agents`, not `Agent Prompt` — match case/emoji-insensitively).
60
+
61
+ #### C. Check exit conditions
62
+
63
+ Stop if there are zero unresolved CodeRabbit threads, or max iterations reached.
64
+
65
+ #### D. Fix each finding
66
+
67
+ For each thread, in order: read the Prompt for AI Agents block in full — it names the issue and the fix. Apply it, staying inside its stated scope. If the suggestion is wrong, unsafe, or needs a product decision, don't force it — note that in step E instead.
68
+
69
+ #### E. Answer and resolve
70
+
71
+ **Reply to the thread first, then resolve it** — the "answer to the comments" half of the job:
72
+
73
+ ```bash
74
+ gh api graphql -f query='mutation { addPullRequestReviewThreadReply(input: {pullRequestReviewThreadId: "<THREAD_ID>", body: "<REPLY>"}) { comment { id } } }'
75
+ ```
76
+
77
+ Reply body: one or two sentences — what you changed and why, or exactly why you didn't fix it. Then resolve (`resolveReviewThread`). A finding you deliberately skip still gets a reply and gets resolved.
78
+
79
+ #### F. Commit and push
80
+
81
+ ```bash
82
+ git add -A
83
+ git commit -m "address CodeRabbit review feedback (coderabbitloop iteration N)"
84
+ git push
85
+ ```
86
+
87
+ Go back to step A.
88
+
89
+ ### 3. Report
90
+
91
+ | Field | Value |
92
+ |--------------------|-------|
93
+ | Iterations | N |
94
+ | Findings resolved | N |
95
+ | Findings skipped | N (with reasons) |
96
+ | Remaining | N (if any) |
97
+ | Blocked | rate-limited / max-iterations / none |
98
+
99
+ ```
100
+ Coderabbitloop complete.
101
+ Iterations: 2
102
+ Resolved: 4 (3 fixed, 1 false-positive, replied + resolved)
103
+ Remaining: 0
104
+ ```
105
+
106
+ ## References
107
+
108
+ - `references/graphql-queries.md` — shared with `qodoloop`: the exact `reviewThreads` query and the `resolveReviewThread` / `addPullRequestReviewThreadReply` mutations. Swap the author-login filter to `coderabbitai[bot]` and the prompt-heading match to `Prompt for AI Agents`.
@@ -0,0 +1,200 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ ---
4
+ description: "Build, test, screenshot and publish Garmin Connect IQ watch faces in Monkey C."
5
+ ---
6
+
7
+ # Garmin Connect IQ watch faces
8
+
9
+ Monkey C gives you almost no safety net. The compiler is happy to build a face
10
+ that draws off the bottom of the screen, a test suite that contains no tests, and
11
+ a colour that is not the colour you get. Everything below is a failure mode that
12
+ looked like success first.
13
+
14
+ **Read `references/` files as needed — do not read them all up front.**
15
+
16
+ | File | When |
17
+ | --- | --- |
18
+ | `references/display.md` | Choosing colours, anything about brightness or legibility |
19
+ | `references/layout.md` | Positioning anything; content clipped, overlapping, or off-screen |
20
+ | `references/testing.md` | Writing tests; a suspiciously clean test run |
21
+ | `references/simulator.md` | Screenshots, settings not applying, monkeydo hanging |
22
+ | `references/devices.md` | Adding device support, launcher icons, API levels |
23
+ | `references/store.md` | Publishing, listing copy, IP questions |
24
+
25
+ ## Tools
26
+
27
+ Run these rather than reinventing them. All are standalone.
28
+
29
+ ```bash
30
+ <skill-dir>/scripts/ciq-doctor # toolchain check: SDK, JDK, key, devices
31
+ <skill-dir>/scripts/ciq-devices # survey installed devices by resolution
32
+ <skill-dir>/scripts/ciq-devices --same-as fenix6pro # products you can add with no code change
33
+ <skill-dir>/scripts/ciq-capture out.png # calibrated simulator screenshot
34
+ <skill-dir>/scripts/ciq-capture out.png --face --size 260 # cropped + masked to the round display
35
+ <skill-dir>/scripts/ciq-calibrate # re-derive the display rect if capture looks wrong
36
+ ```
37
+
38
+ `<skill-dir>/scripts/ciq-capture` exists because `screencapture -R` grabs a screen *region*, not
39
+ a window: without a frontmost check it silently photographs whatever is on top,
40
+ and the window moves between simulator restarts. Both failure modes produce a
41
+ plausible PNG of the wrong thing.
42
+
43
+ ## The five things that will bite you
44
+
45
+ ### 1. `make test` can compile zero tests and report success
46
+
47
+ If `monkey.jungle` sets `base.excludeAnnotations = test`, every `(:test)`
48
+ function is stripped from **every** target, including the unit-test build. You
49
+ get `BUILD SUCCESSFUL` and a green run with nothing compiled — even when the test
50
+ files reference symbols that no longer exist.
51
+
52
+ Fix: a second jungle passed as an additional `-f`. See
53
+ `<skill-dir>/templates/monkey.test.jungle` and the `test` target in `<skill-dir>/templates/Makefile`.
54
+
55
+ **Prove it before you trust it.** Put a deliberately unresolvable symbol in one
56
+ test and confirm the build fails:
57
+
58
+ ```monkeyc
59
+ return ThisDoesNotExist.definitelyNotAFunction();
60
+ ```
61
+
62
+ ### 2. Never hardcode a Y coordinate or assume a font height
63
+
64
+ `dc.getFontHeight()` is the only source of truth, and the numbers are larger than
65
+ they look. Measured on fenix 6 Pro:
66
+
67
+ | Font | Height |
68
+ | --- | --- |
69
+ | `FONT_XTINY` | 19 |
70
+ | `FONT_TINY` | 29 |
71
+ | `FONT_SMALL` | 32 |
72
+ | `FONT_NUMBER_MEDIUM` | 74 |
73
+
74
+ Content drawn past the screen height is simply invisible — no error, no warning,
75
+ no clipping indicator. A two-line `FONT_NUMBER_MEDIUM` block is 148px of a 260px
76
+ face.
77
+
78
+ Derive every Y at draw time, and **clamp** so a bottom row cannot be pushed off:
79
+
80
+ ```monkeyc
81
+ function clampRuleY(derived as Number, footerH as Number) as Number {
82
+ var reserved = (footerH * 2) + GAP_BELOW_RULE + GAP_BETWEEN_ROWS;
83
+ var maxRuleY = SCREEN - BOTTOM_MARGIN - reserved;
84
+ return derived > maxRuleY ? maxRuleY : derived;
85
+ }
86
+ ```
87
+
88
+ See `references/layout.md`.
89
+
90
+ ### 3. The screen is round; your layout is not
91
+
92
+ Check content against the bezel curve, not the bounding square. A rectangle
93
+ inscribed in a circle fails at its **corners** long before its sides.
94
+
95
+ ```monkeyc
96
+ function halfWidthAt(y as Number) as Number {
97
+ var dy = y - CENTER;
98
+ var inside = (CENTER * CENTER) - (dy * dy);
99
+ return inside <= 0 ? 0 : Math.sqrt(inside).toNumber();
100
+ }
101
+ ```
102
+
103
+ ### 4. Colours are quantised, and brightness is reflectance
104
+
105
+ Many devices snap to a 4×4×4 lattice: `0x00 / 0x55 / 0xAA / 0xFF` per channel. A
106
+ colour not already on it is not the colour that ships.
107
+
108
+ More important: MIP screens are **transflective with no backlight**. A colour's
109
+ brightness *is* how much ambient light it returns. Grey reflects about two-thirds
110
+ of what white does. Choosing a photographically accurate grey for a large area
111
+ makes the whole face read as dim on the wrist while looking fine in the
112
+ simulator's backlit LCD.
113
+
114
+ Corollary: a saturated colour on a glyph reflects only its own channel, making
115
+ the thing you want to read the *dimmest* thing on screen.
116
+
117
+ See `references/display.md`.
118
+
119
+ ### 5. The simulator lies about settings
120
+
121
+ It persists app settings and **ignores changed defaults in `properties.xml`**
122
+ until you do File → Reset All App Data. A property will keep reading its old
123
+ value while the XML plainly says otherwise. This looks exactly like broken
124
+ settings code.
125
+
126
+ Reset also drops the loaded device, so relaunch and re-push afterwards.
127
+
128
+ See `references/simulator.md`.
129
+
130
+ ## Workflow
131
+
132
+ ### Starting a face
133
+
134
+ 1. `<skill-dir>/scripts/ciq-doctor` — confirm SDK, JDK, developer key, target device installed.
135
+ 2. Copy `<skill-dir>/templates/Makefile`, `<skill-dir>/templates/monkey.jungle`, `<skill-dir>/templates/monkey.test.jungle`.
136
+ 3. Generate a fresh app id: `python3 -c "import uuid;print(uuid.uuid4().hex)"`.
137
+ 4. Split source by responsibility. This structure has held up well:
138
+
139
+ | Module | Holds |
140
+ | --- | --- |
141
+ | `Palette.mc` | Colours only, all lattice-exact |
142
+ | `Layout.mc` | Geometry, derivations, bezel maths — no drawing |
143
+ | `<Widget>.mc` | Drawing primitives (rows, bars, segments) |
144
+ | `Fields.mc` | Formatting and thresholds — pure, easy to test |
145
+ | `Sensors.mc` | Sensor reads with null handling |
146
+ | `<Name>View.mc` | Composition only |
147
+
148
+ Keeping `Layout` free of `Dc` calls is what makes geometry unit-testable.
149
+
150
+ ### Every change
151
+
152
+ ```bash
153
+ make build && make test && make lint
154
+ ```
155
+
156
+ `make lint` is level 3 and catches real problems the level 2 build allows.
157
+
158
+ ### Before committing
159
+
160
+ Capture and *look at it*. Layout bugs are invisible in a passing test run:
161
+
162
+ ```bash
163
+ make build && make sim
164
+ <skill-dir>/scripts/ciq-capture /tmp/face.png --face --size 260
165
+ ```
166
+
167
+ Then Read the PNG. Every layout bug in this skill's history was found by looking,
168
+ not by testing.
169
+
170
+ ## Monkey C gotchas
171
+
172
+ - Module-level functions take **no** visibility modifier. `private` and `hidden`
173
+ are class-only; at module scope they are syntax errors.
174
+ - `dc.fillPolygon` wants `Array<[Numeric, Numeric]>`. Cast the literal:
175
+ `[[x, y], ...] as Array<[Numeric, Numeric]>`.
176
+ - `getInitialView()` returns
177
+ `[WatchUi.Views] or [WatchUi.Views, WatchUi.InputDelegates]`.
178
+ - `Application.Properties.getValue()` **throws** when a key is absent, which
179
+ happens on a fresh install before settings have ever been written. Wrap every
180
+ read with a default.
181
+ - Integer division everywhere. Centring an odd width leaves a 1px skew — write
182
+ tests that allow it rather than forcing constants to stay even.
183
+
184
+ ## Reference watches and homages
185
+
186
+ If reproducing a real object, get these right before anything else, because they
187
+ are what makes it recognisable:
188
+
189
+ - **Display polarity.** A 1970s LCD is *positive*: dark segments on a pale panel,
190
+ the inverse of every modern face. Getting this backwards turns a crystal into a
191
+ screen.
192
+ - **Proportion.** Bezels on vintage digitals are thick; the window is smaller
193
+ than memory suggests.
194
+ - **Where the legends sit** — maker's name on the bezel, not the glass.
195
+
196
+ No system font is a segment display. If you need one, draw it: see
197
+ `references/layout.md` for a working seven-segment renderer, including the ghost
198
+ (unlit) segments that are most of what sells the effect.
199
+
200
+ **Do not print a real brand on the face.** See `references/store.md`.