@olegkoval/agent-skills 1.28.0 → 1.29.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/plugin.json +6 -2
- package/.cursor-plugin/index.json +21 -1
- package/.grok-plugin/index.json +21 -1
- package/.kiro/steering/garmin-watchface.md +83 -31
- package/.windsurf/rules/garmin-watchface.md +83 -31
- package/README.md +5 -1
- package/catalog/skills.json +95 -1
- package/package.json +1 -1
- package/packages/software-development/branch-cleanup/SKILL.md +204 -0
- package/packages/software-development/branch-cleanup/adapters/claude/plugin.json +5 -0
- package/packages/software-development/branch-cleanup/adapters/claude/skills/branch-cleanup/SKILL.md +205 -0
- package/packages/software-development/branch-cleanup/adapters/codex/README.md +19 -0
- package/packages/software-development/branch-cleanup/adapters/cursor/plugin.json +6 -0
- package/packages/software-development/branch-cleanup/adapters/cursor/skills/branch-cleanup/SKILL.md +205 -0
- package/packages/software-development/branch-cleanup/adapters/grok/plugin.json +6 -0
- package/packages/software-development/branch-cleanup/adapters/grok/skills/branch-cleanup/SKILL.md +205 -0
- package/packages/software-development/morning-routine/SKILL.md +149 -0
- package/packages/software-development/morning-routine/adapters/claude/plugin.json +5 -0
- package/packages/software-development/morning-routine/adapters/claude/skills/morning-routine/SKILL.md +150 -0
- package/packages/software-development/morning-routine/adapters/codex/README.md +19 -0
- package/packages/software-development/morning-routine/adapters/cursor/plugin.json +6 -0
- package/packages/software-development/morning-routine/adapters/cursor/skills/morning-routine/SKILL.md +150 -0
- package/packages/software-development/morning-routine/adapters/grok/plugin.json +6 -0
- package/packages/software-development/morning-routine/adapters/grok/skills/morning-routine/SKILL.md +150 -0
- package/packages/software-development/pr-finalize-complete/adapters/claude/plugin.json +1 -1
- package/packages/software-development/pr-finalize-complete/adapters/codex/README.md +7 -11
- package/packages/software-development/pr-finalize-complete/adapters/cursor/plugin.json +1 -1
- package/packages/software-development/pr-finalize-complete/adapters/grok/plugin.json +1 -1
- package/packages/software-development/release-day/SKILL.md +286 -0
- package/packages/software-development/release-day/adapters/claude/plugin.json +5 -0
- package/packages/software-development/release-day/adapters/claude/skills/release-day/SKILL.md +287 -0
- package/packages/software-development/release-day/adapters/codex/README.md +19 -0
- package/packages/software-development/release-day/adapters/cursor/plugin.json +6 -0
- package/packages/software-development/release-day/adapters/cursor/skills/release-day/SKILL.md +287 -0
- package/packages/software-development/release-day/adapters/grok/plugin.json +6 -0
- package/packages/software-development/release-day/adapters/grok/skills/release-day/SKILL.md +287 -0
- package/packages/wearables/garmin-watchface/SKILL.md +82 -35
- package/packages/wearables/garmin-watchface/adapters/claude/plugin.json +1 -1
- package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/SKILL.md +82 -35
- package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/references/design-proposals.md +99 -0
- package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/references/devices.md +112 -0
- package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/references/display.md +78 -3
- package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/references/inspiration-wizard.md +140 -0
- package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/references/layout.md +28 -0
- package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/references/publishing.md +134 -5
- package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/references/simulator.md +86 -2
- package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/scripts/ciq-inspire +329 -0
- package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/scripts/ciq-mock +502 -0
- package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/scripts/ciq-release +12 -6
- package/packages/wearables/garmin-watchface/adapters/cursor/plugin.json +1 -1
- package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/SKILL.md +82 -35
- package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/references/design-proposals.md +99 -0
- package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/references/devices.md +112 -0
- package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/references/display.md +78 -3
- package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/references/inspiration-wizard.md +140 -0
- package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/references/layout.md +28 -0
- package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/references/publishing.md +134 -5
- package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/references/simulator.md +86 -2
- package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/scripts/ciq-inspire +329 -0
- package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/scripts/ciq-mock +502 -0
- package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/scripts/ciq-release +12 -6
- package/packages/wearables/garmin-watchface/adapters/grok/plugin.json +1 -1
- package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/SKILL.md +82 -35
- package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/references/design-proposals.md +99 -0
- package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/references/devices.md +112 -0
- package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/references/display.md +78 -3
- package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/references/inspiration-wizard.md +140 -0
- package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/references/layout.md +28 -0
- package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/references/publishing.md +134 -5
- package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/references/simulator.md +86 -2
- package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/scripts/ciq-inspire +329 -0
- package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/scripts/ciq-mock +502 -0
- package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/scripts/ciq-release +12 -6
- package/packages/wearables/garmin-watchface/adapters/kiro/steering/garmin-watchface.md +83 -31
- package/packages/wearables/garmin-watchface/adapters/windsurf/rules/garmin-watchface.md +83 -31
- package/packages/wearables/garmin-watchface/references/design-proposals.md +99 -0
- package/packages/wearables/garmin-watchface/references/devices.md +112 -0
- package/packages/wearables/garmin-watchface/references/display.md +78 -3
- package/packages/wearables/garmin-watchface/references/inspiration-wizard.md +140 -0
- package/packages/wearables/garmin-watchface/references/layout.md +28 -0
- package/packages/wearables/garmin-watchface/references/publishing.md +134 -5
- package/packages/wearables/garmin-watchface/references/simulator.md +86 -2
- package/packages/wearables/garmin-watchface/scripts/ciq-inspire +329 -0
- package/packages/wearables/garmin-watchface/scripts/ciq-mock +502 -0
- package/packages/wearables/garmin-watchface/scripts/ciq-release +12 -6
|
@@ -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.
|
|
4
|
+
"version": "1.28.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Oleg Koval"
|
|
7
7
|
},
|
|
@@ -48,6 +48,10 @@
|
|
|
48
48
|
"./packages/software-development/ci-fix-loop",
|
|
49
49
|
"./packages/software-development/pr-to-green",
|
|
50
50
|
"./packages/software-development/dependabot-triage",
|
|
51
|
-
"./packages/software-development/store-listing-copy"
|
|
51
|
+
"./packages/software-development/store-listing-copy",
|
|
52
|
+
"./packages/software-development/pr-finalize-complete",
|
|
53
|
+
"./packages/software-development/morning-routine",
|
|
54
|
+
"./packages/software-development/release-day",
|
|
55
|
+
"./packages/software-development/branch-cleanup"
|
|
52
56
|
]
|
|
53
57
|
}
|
|
@@ -124,7 +124,7 @@
|
|
|
124
124
|
{
|
|
125
125
|
"name": "olko:garmin-watchface",
|
|
126
126
|
"source": "./packages/wearables/garmin-watchface/adapters/cursor",
|
|
127
|
-
"description": "
|
|
127
|
+
"description": "Design, build, test, screenshot and publish Garmin Connect IQ watch faces in Monkey C."
|
|
128
128
|
},
|
|
129
129
|
{
|
|
130
130
|
"name": "olko:coderabbitloop",
|
|
@@ -185,6 +185,26 @@
|
|
|
185
185
|
"name": "olko:store-listing-copy",
|
|
186
186
|
"source": "./packages/software-development/store-listing-copy/adapters/cursor",
|
|
187
187
|
"description": "Generate platform-validated App Store, Google Play, and Connect IQ store listing copy (title, subtitle, description, what's new, keywords) from a git changelog or release notes."
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
"name": "olko:pr-finalize-complete",
|
|
191
|
+
"source": "./packages/software-development/pr-finalize-complete/adapters/cursor",
|
|
192
|
+
"description": "Comprehensive PR finalization workflow for PRs that may already be partially addressed: checks each review comment's actual current status in code, distinguishes fixed vs. stale vs. still-present findings, verifies test coverage, runs real lint/test gates, and reports what still needs a human."
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
"name": "olko:morning-routine",
|
|
196
|
+
"source": "./packages/software-development/morning-routine/adapters/cursor",
|
|
197
|
+
"description": "Run the complete start-of-day setup in one pass: roll over unfinished Obsidian tasks to today's daily note, sync open GitHub PRs that need your attention, and sweep Dependabot patch bumps. Chains obsidian-task-rollover, obsidian-pr-sync, and dependabot-triage."
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"name": "olko:release-day",
|
|
201
|
+
"source": "./packages/software-development/release-day/adapters/cursor",
|
|
202
|
+
"description": "Orchestrate a full release-day workflow for iOS, Android, or Garmin apps: verify main branch CI is green, generate changelog, draft platform-ready store listing copy, trigger semantic-release or tag manually, wait for the build, and queue the App Store submission."
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
"name": "olko:branch-cleanup",
|
|
206
|
+
"source": "./packages/software-development/branch-cleanup/adapters/cursor",
|
|
207
|
+
"description": "Prune stale git branches after a merge wave: delete closed/merged remote branches, remove local tracking refs that no longer exist on the remote, and optionally clean up merged local branches. Natural follow-up to dependabot-triage."
|
|
188
208
|
}
|
|
189
209
|
]
|
|
190
210
|
}
|
package/.grok-plugin/index.json
CHANGED
|
@@ -134,7 +134,7 @@
|
|
|
134
134
|
{
|
|
135
135
|
"name": "olko:garmin-watchface",
|
|
136
136
|
"source": "./packages/wearables/garmin-watchface/adapters/grok",
|
|
137
|
-
"description": "
|
|
137
|
+
"description": "Design, build, test, screenshot and publish Garmin Connect IQ watch faces in Monkey C."
|
|
138
138
|
},
|
|
139
139
|
{
|
|
140
140
|
"name": "olko:coderabbitloop",
|
|
@@ -195,6 +195,26 @@
|
|
|
195
195
|
"name": "olko:store-listing-copy",
|
|
196
196
|
"source": "./packages/software-development/store-listing-copy/adapters/grok",
|
|
197
197
|
"description": "Generate platform-validated App Store, Google Play, and Connect IQ store listing copy (title, subtitle, description, what's new, keywords) from a git changelog or release notes."
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"name": "olko:pr-finalize-complete",
|
|
201
|
+
"source": "./packages/software-development/pr-finalize-complete/adapters/grok",
|
|
202
|
+
"description": "Comprehensive PR finalization workflow for PRs that may already be partially addressed: checks each review comment's actual current status in code, distinguishes fixed vs. stale vs. still-present findings, verifies test coverage, runs real lint/test gates, and reports what still needs a human."
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
"name": "olko:morning-routine",
|
|
206
|
+
"source": "./packages/software-development/morning-routine/adapters/grok",
|
|
207
|
+
"description": "Run the complete start-of-day setup in one pass: roll over unfinished Obsidian tasks to today's daily note, sync open GitHub PRs that need your attention, and sweep Dependabot patch bumps. Chains obsidian-task-rollover, obsidian-pr-sync, and dependabot-triage."
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
"name": "olko:release-day",
|
|
211
|
+
"source": "./packages/software-development/release-day/adapters/grok",
|
|
212
|
+
"description": "Orchestrate a full release-day workflow for iOS, Android, or Garmin apps: verify main branch CI is green, generate changelog, draft platform-ready store listing copy, trigger semantic-release or tag manually, wait for the build, and queue the App Store submission."
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
"name": "olko:branch-cleanup",
|
|
216
|
+
"source": "./packages/software-development/branch-cleanup/adapters/grok",
|
|
217
|
+
"description": "Prune stale git branches after a merge wave: delete closed/merged remote branches, remove local tracking refs that no longer exist on the remote, and optionally clean up merged local branches. Natural follow-up to dependabot-triage."
|
|
198
218
|
}
|
|
199
219
|
]
|
|
200
220
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
---
|
|
4
4
|
inclusion: manual
|
|
5
|
-
description: "
|
|
5
|
+
description: "Design, build, test, screenshot and publish Garmin Connect IQ watch faces in Monkey C."
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Garmin Connect IQ watch faces
|
|
@@ -12,43 +12,43 @@ that draws off the bottom of the screen, a test suite that contains no tests, an
|
|
|
12
12
|
a colour that is not the colour you get. Everything below is a failure mode that
|
|
13
13
|
looked like success first.
|
|
14
14
|
|
|
15
|
-
**Read `
|
|
15
|
+
**Read `reference/` files as needed — do not read them all up front.**
|
|
16
16
|
|
|
17
17
|
| File | When |
|
|
18
18
|
| --- | --- |
|
|
19
|
-
| `
|
|
20
|
-
| `
|
|
21
|
-
| `
|
|
22
|
-
| `
|
|
23
|
-
| `
|
|
24
|
-
| `
|
|
25
|
-
| `
|
|
19
|
+
| `reference/display.md` | Choosing colours, brightness, legibility; **AMOLED always-on and burn-in** |
|
|
20
|
+
| `reference/layout.md` | Positioning anything; content clipped, overlapping, or off-screen |
|
|
21
|
+
| `reference/testing.md` | Writing tests; a suspiciously clean test run |
|
|
22
|
+
| `reference/simulator.md` | Screenshots, settings not applying, monkeydo hanging |
|
|
23
|
+
| `reference/devices.md` | Adding device support, launcher icons, API levels |
|
|
24
|
+
| `reference/store.md` | Publishing, listing copy, IP questions |
|
|
25
|
+
| `reference/publishing.md` | Driving the store portal in a browser; upload/update flow, validator rejections |
|
|
26
26
|
|
|
27
27
|
## Tools
|
|
28
28
|
|
|
29
29
|
Run these rather than reinventing them. All are standalone.
|
|
30
30
|
|
|
31
31
|
```bash
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
32
|
+
bin/ciq-doctor # toolchain check: SDK, JDK, key, devices
|
|
33
|
+
bin/ciq-devices # survey installed devices by resolution
|
|
34
|
+
bin/ciq-devices --same-as fenix6pro # products you can add with no code change
|
|
35
|
+
bin/ciq-capture out.png # calibrated simulator screenshot
|
|
36
|
+
bin/ciq-capture out.png --face --size 260 # cropped + masked to the round display
|
|
37
|
+
bin/ciq-calibrate # re-derive the display rect if capture looks wrong
|
|
38
|
+
bin/ciq-release # pre-submission check: package, screenshots, icon, keys, copy
|
|
39
39
|
```
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
41
|
+
`bin/ciq-release` is what you run before opening the store portal. Every check
|
|
42
|
+
in it is something otherwise discovered halfway through the submission form --
|
|
43
|
+
a stale screenshot set, an icon still copied from the last project, or copy
|
|
44
|
+
containing a character the description validator rejects.
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
`bin/ciq-capture` exists because `screencapture -R` grabs a screen *region*, not
|
|
47
47
|
a window: without a frontmost check it silently photographs whatever is on top,
|
|
48
48
|
and the window moves between simulator restarts. Both failure modes produce a
|
|
49
49
|
plausible PNG of the wrong thing.
|
|
50
50
|
|
|
51
|
-
## The
|
|
51
|
+
## The seven things that will bite you
|
|
52
52
|
|
|
53
53
|
### 1. `make test` can compile zero tests and report success
|
|
54
54
|
|
|
@@ -58,7 +58,7 @@ get `BUILD SUCCESSFUL` and a green run with nothing compiled — even when the t
|
|
|
58
58
|
files reference symbols that no longer exist.
|
|
59
59
|
|
|
60
60
|
Fix: a second jungle passed as an additional `-f`. See
|
|
61
|
-
|
|
61
|
+
`templates/monkey.test.jungle` and the `test` target in `templates/Makefile`.
|
|
62
62
|
|
|
63
63
|
**Prove it before you trust it.** Put a deliberately unresolvable symbol in one
|
|
64
64
|
test and confirm the build fails:
|
|
@@ -79,6 +79,13 @@ they look. Measured on fenix 6 Pro:
|
|
|
79
79
|
| `FONT_SMALL` | 32 |
|
|
80
80
|
| `FONT_NUMBER_MEDIUM` | 74 |
|
|
81
81
|
|
|
82
|
+
**Font tiers already scale with the device.** `FONT_XTINY` is a tier, not a
|
|
83
|
+
pixel height: a 454px watch supplies a proportionately taller glyph than a
|
|
84
|
+
260px one, unasked. So when text looks wrong at a new resolution, the bug is a
|
|
85
|
+
LENGTH that failed to scale, never the font. Do not add screen-size branching
|
|
86
|
+
to pick a bigger tier -- doing so double-scales, and labels end up wider than
|
|
87
|
+
the containers naming them.
|
|
88
|
+
|
|
82
89
|
Content drawn past the screen height is simply invisible — no error, no warning,
|
|
83
90
|
no clipping indicator. A two-line `FONT_NUMBER_MEDIUM` block is 148px of a 260px
|
|
84
91
|
face.
|
|
@@ -93,7 +100,7 @@ function clampRuleY(derived as Number, footerH as Number) as Number {
|
|
|
93
100
|
}
|
|
94
101
|
```
|
|
95
102
|
|
|
96
|
-
See `
|
|
103
|
+
See `reference/layout.md`.
|
|
97
104
|
|
|
98
105
|
### 3. The screen is round; your layout is not
|
|
99
106
|
|
|
@@ -122,7 +129,7 @@ simulator's backlit LCD.
|
|
|
122
129
|
Corollary: a saturated colour on a glyph reflects only its own channel, making
|
|
123
130
|
the thing you want to read the *dimmest* thing on screen.
|
|
124
131
|
|
|
125
|
-
See `
|
|
132
|
+
See `reference/display.md`.
|
|
126
133
|
|
|
127
134
|
### 5. The simulator lies about settings
|
|
128
135
|
|
|
@@ -133,14 +140,59 @@ settings code.
|
|
|
133
140
|
|
|
134
141
|
Reset also drops the loaded device, so relaunch and re-push afterwards.
|
|
135
142
|
|
|
136
|
-
See `
|
|
143
|
+
See `reference/simulator.md`.
|
|
144
|
+
|
|
145
|
+
### 6. On AMOLED, the face you designed is the one that fails review
|
|
146
|
+
|
|
147
|
+
`requiresBurnInProtection` devices must show a restricted always-on frame
|
|
148
|
+
between wrist raises. The trap is that the *stronger* your face's identity —
|
|
149
|
+
a bright panel, a filled dial — the worse a dimmed version of it performs,
|
|
150
|
+
because it still lights most of the screen. The always-on frame has to be a
|
|
151
|
+
different drawing: outlines where there were fills, and shifted a few pixels on
|
|
152
|
+
a cycle so no pixel is driven continuously.
|
|
153
|
+
|
|
154
|
+
Also note the flag can be **null** on older products, and a null propagating
|
|
155
|
+
into a `Boolean` field throws at the first wrist drop.
|
|
156
|
+
|
|
157
|
+
See the AMOLED section of `reference/display.md`.
|
|
158
|
+
|
|
159
|
+
### 7. A watch face CAN have settings on the watch
|
|
160
|
+
|
|
161
|
+
`AppBase.getSettingsView()` has existed since **API 3.2.0** and the SDK
|
|
162
|
+
documents it as "only applicable to watch faces and data fields". Plenty of
|
|
163
|
+
store copy — including, at one point, this author's own — claims settings are
|
|
164
|
+
reachable only from the phone. They are not.
|
|
165
|
+
|
|
166
|
+
The override signature must include `or Null` or the compiler rejects it as
|
|
167
|
+
narrowing:
|
|
168
|
+
|
|
169
|
+
```monkeyc
|
|
170
|
+
function getSettingsView() as
|
|
171
|
+
[WatchUi.Views] or [WatchUi.Views, WatchUi.InputDelegates] or Null {
|
|
172
|
+
return [new SettingsMenu(), new SettingsMenuDelegate()];
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
Two things to get right in the menu itself:
|
|
177
|
+
|
|
178
|
+
- `ToggleMenuItem` has **already flipped its own state** by the time `onSelect`
|
|
179
|
+
runs. Read `isEnabled()`; negating the stored value inverts the setting.
|
|
180
|
+
- A picker should `setFocus()` the current choice, not open at the top of a long
|
|
181
|
+
list. If the list filters out unavailable options, item position is *not* the
|
|
182
|
+
option id — count the focus row as you build the list.
|
|
183
|
+
|
|
184
|
+
Keep one module that owns every property read, each wrapped with a default, and
|
|
185
|
+
have both the phone path and the on-watch menu go through it. Two readers with
|
|
186
|
+
two sets of defaults is exactly how the watch and the phone come to disagree
|
|
187
|
+
about what "off" means — and check the fallbacks actually match
|
|
188
|
+
`properties.xml`, because nothing enforces that.
|
|
137
189
|
|
|
138
190
|
## Workflow
|
|
139
191
|
|
|
140
192
|
### Starting a face
|
|
141
193
|
|
|
142
|
-
1.
|
|
143
|
-
2. Copy
|
|
194
|
+
1. `bin/ciq-doctor` — confirm SDK, JDK, developer key, target device installed.
|
|
195
|
+
2. Copy `templates/Makefile`, `templates/monkey.jungle`, `templates/monkey.test.jungle`.
|
|
144
196
|
3. Generate a fresh app id: `python3 -c "import uuid;print(uuid.uuid4().hex)"`.
|
|
145
197
|
4. Split source by responsibility. This structure has held up well:
|
|
146
198
|
|
|
@@ -169,7 +221,7 @@ Capture and *look at it*. Layout bugs are invisible in a passing test run:
|
|
|
169
221
|
|
|
170
222
|
```bash
|
|
171
223
|
make build && make sim
|
|
172
|
-
|
|
224
|
+
bin/ciq-capture /tmp/face.png --face --size 260
|
|
173
225
|
```
|
|
174
226
|
|
|
175
227
|
Then Read the PNG. Every layout bug in this skill's history was found by looking,
|
|
@@ -202,7 +254,7 @@ are what makes it recognisable:
|
|
|
202
254
|
- **Where the legends sit** — maker's name on the bezel, not the glass.
|
|
203
255
|
|
|
204
256
|
No system font is a segment display. If you need one, draw it: see
|
|
205
|
-
`
|
|
257
|
+
`reference/layout.md` for a working seven-segment renderer, including the ghost
|
|
206
258
|
(unlit) segments that are most of what sells the effect.
|
|
207
259
|
|
|
208
|
-
**Do not print a real brand on the face.** See `
|
|
260
|
+
**Do not print a real brand on the face.** See `reference/store.md`.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
|
|
2
2
|
|
|
3
3
|
---
|
|
4
|
-
description: "
|
|
4
|
+
description: "Design, build, test, screenshot and publish Garmin Connect IQ watch faces in Monkey C."
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Garmin Connect IQ watch faces
|
|
@@ -11,43 +11,43 @@ that draws off the bottom of the screen, a test suite that contains no tests, an
|
|
|
11
11
|
a colour that is not the colour you get. Everything below is a failure mode that
|
|
12
12
|
looked like success first.
|
|
13
13
|
|
|
14
|
-
**Read `
|
|
14
|
+
**Read `reference/` files as needed — do not read them all up front.**
|
|
15
15
|
|
|
16
16
|
| File | When |
|
|
17
17
|
| --- | --- |
|
|
18
|
-
| `
|
|
19
|
-
| `
|
|
20
|
-
| `
|
|
21
|
-
| `
|
|
22
|
-
| `
|
|
23
|
-
| `
|
|
24
|
-
| `
|
|
18
|
+
| `reference/display.md` | Choosing colours, brightness, legibility; **AMOLED always-on and burn-in** |
|
|
19
|
+
| `reference/layout.md` | Positioning anything; content clipped, overlapping, or off-screen |
|
|
20
|
+
| `reference/testing.md` | Writing tests; a suspiciously clean test run |
|
|
21
|
+
| `reference/simulator.md` | Screenshots, settings not applying, monkeydo hanging |
|
|
22
|
+
| `reference/devices.md` | Adding device support, launcher icons, API levels |
|
|
23
|
+
| `reference/store.md` | Publishing, listing copy, IP questions |
|
|
24
|
+
| `reference/publishing.md` | Driving the store portal in a browser; upload/update flow, validator rejections |
|
|
25
25
|
|
|
26
26
|
## Tools
|
|
27
27
|
|
|
28
28
|
Run these rather than reinventing them. All are standalone.
|
|
29
29
|
|
|
30
30
|
```bash
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
31
|
+
bin/ciq-doctor # toolchain check: SDK, JDK, key, devices
|
|
32
|
+
bin/ciq-devices # survey installed devices by resolution
|
|
33
|
+
bin/ciq-devices --same-as fenix6pro # products you can add with no code change
|
|
34
|
+
bin/ciq-capture out.png # calibrated simulator screenshot
|
|
35
|
+
bin/ciq-capture out.png --face --size 260 # cropped + masked to the round display
|
|
36
|
+
bin/ciq-calibrate # re-derive the display rect if capture looks wrong
|
|
37
|
+
bin/ciq-release # pre-submission check: package, screenshots, icon, keys, copy
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
40
|
+
`bin/ciq-release` is what you run before opening the store portal. Every check
|
|
41
|
+
in it is something otherwise discovered halfway through the submission form --
|
|
42
|
+
a stale screenshot set, an icon still copied from the last project, or copy
|
|
43
|
+
containing a character the description validator rejects.
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
`bin/ciq-capture` exists because `screencapture -R` grabs a screen *region*, not
|
|
46
46
|
a window: without a frontmost check it silently photographs whatever is on top,
|
|
47
47
|
and the window moves between simulator restarts. Both failure modes produce a
|
|
48
48
|
plausible PNG of the wrong thing.
|
|
49
49
|
|
|
50
|
-
## The
|
|
50
|
+
## The seven things that will bite you
|
|
51
51
|
|
|
52
52
|
### 1. `make test` can compile zero tests and report success
|
|
53
53
|
|
|
@@ -57,7 +57,7 @@ get `BUILD SUCCESSFUL` and a green run with nothing compiled — even when the t
|
|
|
57
57
|
files reference symbols that no longer exist.
|
|
58
58
|
|
|
59
59
|
Fix: a second jungle passed as an additional `-f`. See
|
|
60
|
-
|
|
60
|
+
`templates/monkey.test.jungle` and the `test` target in `templates/Makefile`.
|
|
61
61
|
|
|
62
62
|
**Prove it before you trust it.** Put a deliberately unresolvable symbol in one
|
|
63
63
|
test and confirm the build fails:
|
|
@@ -78,6 +78,13 @@ they look. Measured on fenix 6 Pro:
|
|
|
78
78
|
| `FONT_SMALL` | 32 |
|
|
79
79
|
| `FONT_NUMBER_MEDIUM` | 74 |
|
|
80
80
|
|
|
81
|
+
**Font tiers already scale with the device.** `FONT_XTINY` is a tier, not a
|
|
82
|
+
pixel height: a 454px watch supplies a proportionately taller glyph than a
|
|
83
|
+
260px one, unasked. So when text looks wrong at a new resolution, the bug is a
|
|
84
|
+
LENGTH that failed to scale, never the font. Do not add screen-size branching
|
|
85
|
+
to pick a bigger tier -- doing so double-scales, and labels end up wider than
|
|
86
|
+
the containers naming them.
|
|
87
|
+
|
|
81
88
|
Content drawn past the screen height is simply invisible — no error, no warning,
|
|
82
89
|
no clipping indicator. A two-line `FONT_NUMBER_MEDIUM` block is 148px of a 260px
|
|
83
90
|
face.
|
|
@@ -92,7 +99,7 @@ function clampRuleY(derived as Number, footerH as Number) as Number {
|
|
|
92
99
|
}
|
|
93
100
|
```
|
|
94
101
|
|
|
95
|
-
See `
|
|
102
|
+
See `reference/layout.md`.
|
|
96
103
|
|
|
97
104
|
### 3. The screen is round; your layout is not
|
|
98
105
|
|
|
@@ -121,7 +128,7 @@ simulator's backlit LCD.
|
|
|
121
128
|
Corollary: a saturated colour on a glyph reflects only its own channel, making
|
|
122
129
|
the thing you want to read the *dimmest* thing on screen.
|
|
123
130
|
|
|
124
|
-
See `
|
|
131
|
+
See `reference/display.md`.
|
|
125
132
|
|
|
126
133
|
### 5. The simulator lies about settings
|
|
127
134
|
|
|
@@ -132,14 +139,59 @@ settings code.
|
|
|
132
139
|
|
|
133
140
|
Reset also drops the loaded device, so relaunch and re-push afterwards.
|
|
134
141
|
|
|
135
|
-
See `
|
|
142
|
+
See `reference/simulator.md`.
|
|
143
|
+
|
|
144
|
+
### 6. On AMOLED, the face you designed is the one that fails review
|
|
145
|
+
|
|
146
|
+
`requiresBurnInProtection` devices must show a restricted always-on frame
|
|
147
|
+
between wrist raises. The trap is that the *stronger* your face's identity —
|
|
148
|
+
a bright panel, a filled dial — the worse a dimmed version of it performs,
|
|
149
|
+
because it still lights most of the screen. The always-on frame has to be a
|
|
150
|
+
different drawing: outlines where there were fills, and shifted a few pixels on
|
|
151
|
+
a cycle so no pixel is driven continuously.
|
|
152
|
+
|
|
153
|
+
Also note the flag can be **null** on older products, and a null propagating
|
|
154
|
+
into a `Boolean` field throws at the first wrist drop.
|
|
155
|
+
|
|
156
|
+
See the AMOLED section of `reference/display.md`.
|
|
157
|
+
|
|
158
|
+
### 7. A watch face CAN have settings on the watch
|
|
159
|
+
|
|
160
|
+
`AppBase.getSettingsView()` has existed since **API 3.2.0** and the SDK
|
|
161
|
+
documents it as "only applicable to watch faces and data fields". Plenty of
|
|
162
|
+
store copy — including, at one point, this author's own — claims settings are
|
|
163
|
+
reachable only from the phone. They are not.
|
|
164
|
+
|
|
165
|
+
The override signature must include `or Null` or the compiler rejects it as
|
|
166
|
+
narrowing:
|
|
167
|
+
|
|
168
|
+
```monkeyc
|
|
169
|
+
function getSettingsView() as
|
|
170
|
+
[WatchUi.Views] or [WatchUi.Views, WatchUi.InputDelegates] or Null {
|
|
171
|
+
return [new SettingsMenu(), new SettingsMenuDelegate()];
|
|
172
|
+
}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Two things to get right in the menu itself:
|
|
176
|
+
|
|
177
|
+
- `ToggleMenuItem` has **already flipped its own state** by the time `onSelect`
|
|
178
|
+
runs. Read `isEnabled()`; negating the stored value inverts the setting.
|
|
179
|
+
- A picker should `setFocus()` the current choice, not open at the top of a long
|
|
180
|
+
list. If the list filters out unavailable options, item position is *not* the
|
|
181
|
+
option id — count the focus row as you build the list.
|
|
182
|
+
|
|
183
|
+
Keep one module that owns every property read, each wrapped with a default, and
|
|
184
|
+
have both the phone path and the on-watch menu go through it. Two readers with
|
|
185
|
+
two sets of defaults is exactly how the watch and the phone come to disagree
|
|
186
|
+
about what "off" means — and check the fallbacks actually match
|
|
187
|
+
`properties.xml`, because nothing enforces that.
|
|
136
188
|
|
|
137
189
|
## Workflow
|
|
138
190
|
|
|
139
191
|
### Starting a face
|
|
140
192
|
|
|
141
|
-
1.
|
|
142
|
-
2. Copy
|
|
193
|
+
1. `bin/ciq-doctor` — confirm SDK, JDK, developer key, target device installed.
|
|
194
|
+
2. Copy `templates/Makefile`, `templates/monkey.jungle`, `templates/monkey.test.jungle`.
|
|
143
195
|
3. Generate a fresh app id: `python3 -c "import uuid;print(uuid.uuid4().hex)"`.
|
|
144
196
|
4. Split source by responsibility. This structure has held up well:
|
|
145
197
|
|
|
@@ -168,7 +220,7 @@ Capture and *look at it*. Layout bugs are invisible in a passing test run:
|
|
|
168
220
|
|
|
169
221
|
```bash
|
|
170
222
|
make build && make sim
|
|
171
|
-
|
|
223
|
+
bin/ciq-capture /tmp/face.png --face --size 260
|
|
172
224
|
```
|
|
173
225
|
|
|
174
226
|
Then Read the PNG. Every layout bug in this skill's history was found by looking,
|
|
@@ -201,7 +253,7 @@ are what makes it recognisable:
|
|
|
201
253
|
- **Where the legends sit** — maker's name on the bezel, not the glass.
|
|
202
254
|
|
|
203
255
|
No system font is a segment display. If you need one, draw it: see
|
|
204
|
-
`
|
|
256
|
+
`reference/layout.md` for a working seven-segment renderer, including the ghost
|
|
205
257
|
(unlit) segments that are most of what sells the effect.
|
|
206
258
|
|
|
207
|
-
**Do not print a real brand on the face.** See `
|
|
259
|
+
**Do not print a real brand on the face.** See `reference/store.md`.
|
package/README.md
CHANGED
|
@@ -182,6 +182,10 @@ Each entry links to its `SKILL.md`. Reference any skill by its `olko:*` lookup n
|
|
|
182
182
|
| [pr-to-green](packages/software-development/pr-to-green/SKILL.md) | Orchestrates a GitHub PR from first push to merge-ready: runs ci-fix-loop until checks are green, detects active AI review bots, runs qodoloop and coderabbitloop in sequence, and confirms zero unresolved threads | Driving a PR to merge-ready in one pass without manually chaining the fix loops |
|
|
183
183
|
| [dependabot-triage](packages/software-development/dependabot-triage/SKILL.md) | Triages open Dependabot and Renovate PRs in bulk: classifies by risk tier, auto-approves safe patch bumps, flags breaking major upgrades for human review, and posts a digest | Clearing a backlog of dependency update PRs during a maintenance window |
|
|
184
184
|
| [store-listing-copy](packages/software-development/store-listing-copy/SKILL.md) | Generates platform-validated App Store, Google Play, and Connect IQ store listing copy (title, subtitle, description, what's new, keywords) from a git changelog | Writing store copy before submitting to apple-store-submit or the garmin-watchface store workflow |
|
|
185
|
+
| [pr-finalize-complete](packages/software-development/pr-finalize-complete/SKILL.md) | Comprehensive PR finalization for branches that may already be partially addressed: checks each review comment's actual current status in code, distinguishes fixed vs. stale vs. still-present findings, verifies test coverage, and runs real lint/test gates | Confirming a PR is genuinely merge-ready when review tools show findings that may already be fixed |
|
|
186
|
+
| [morning-routine](packages/software-development/morning-routine/SKILL.md) | Runs the complete start-of-day setup in one pass: rolls over unfinished Obsidian tasks, syncs open GitHub PRs into today's daily note, and sweeps safe Dependabot patch bumps | Starting the workday by chaining obsidian-task-rollover, obsidian-pr-sync, and dependabot-triage in sequence |
|
|
187
|
+
| [release-day](packages/software-development/release-day/SKILL.md) | Orchestrates a full release-day workflow for iOS, Android, or Garmin apps: verifies CI is green, generates a changelog, drafts store listing copy, triggers semantic-release or tags manually, waits for the build, and queues the App Store submission | Cutting a release from "code is ready" to "build submitted" in one orchestrated pass |
|
|
188
|
+
| [branch-cleanup](packages/software-development/branch-cleanup/SKILL.md) | Prunes stale git branches after a merge wave: deletes closed/merged remote branches, removes local tracking refs that no longer exist on the remote, and optionally cleans up merged local branches | Tidying up after a Dependabot triage batch merge or a sprint wind-down |
|
|
185
189
|
|
|
186
190
|
### Marketing (2)
|
|
187
191
|
|
|
@@ -206,7 +210,7 @@ Each entry links to its `SKILL.md`. Reference any skill by its `olko:*` lookup n
|
|
|
206
210
|
|
|
207
211
|
| Skill | What it does | Use when |
|
|
208
212
|
|-------|-------------|----------|
|
|
209
|
-
| [garmin-watchface](packages/wearables/garmin-watchface/SKILL.md) |
|
|
213
|
+
| [garmin-watchface](packages/wearables/garmin-watchface/SKILL.md) | Designs, builds, tests, screenshots, and publishes Garmin Connect IQ watch faces in Monkey C | Working on a Connect IQ watch face — SVG design proposals, inspiration gathering, layout that clips or overlaps, simulator screenshots, app settings, device support, or store submission |
|
|
210
214
|
|
|
211
215
|
## How to use skills
|
|
212
216
|
|
package/catalog/skills.json
CHANGED
|
@@ -628,7 +628,7 @@
|
|
|
628
628
|
"lookupName": "olko:garmin-watchface",
|
|
629
629
|
"category": "wearables",
|
|
630
630
|
"path": "packages/wearables/garmin-watchface",
|
|
631
|
-
"description": "
|
|
631
|
+
"description": "Design, build, test, screenshot and publish Garmin Connect IQ watch faces in Monkey C.",
|
|
632
632
|
"tags": [
|
|
633
633
|
"garmin",
|
|
634
634
|
"connect-iq",
|
|
@@ -930,6 +930,100 @@
|
|
|
930
930
|
"copilot",
|
|
931
931
|
"grok"
|
|
932
932
|
]
|
|
933
|
+
},
|
|
934
|
+
{
|
|
935
|
+
"name": "pr-finalize-complete",
|
|
936
|
+
"lookupName": "olko:pr-finalize-complete",
|
|
937
|
+
"category": "software-development",
|
|
938
|
+
"path": "packages/software-development/pr-finalize-complete",
|
|
939
|
+
"description": "Comprehensive PR finalization workflow for PRs that may already be partially addressed: checks each review comment's actual current status in code, distinguishes fixed vs. stale vs. still-present findings, verifies test coverage, runs real lint/test gates, and reports what still needs a human.",
|
|
940
|
+
"tags": [
|
|
941
|
+
"code-review",
|
|
942
|
+
"pull-requests",
|
|
943
|
+
"github",
|
|
944
|
+
"testing",
|
|
945
|
+
"automation",
|
|
946
|
+
"verification"
|
|
947
|
+
],
|
|
948
|
+
"adapters": [
|
|
949
|
+
"codex",
|
|
950
|
+
"claude",
|
|
951
|
+
"cursor",
|
|
952
|
+
"copilot",
|
|
953
|
+
"grok"
|
|
954
|
+
]
|
|
955
|
+
},
|
|
956
|
+
{
|
|
957
|
+
"name": "morning-routine",
|
|
958
|
+
"lookupName": "olko:morning-routine",
|
|
959
|
+
"category": "software-development",
|
|
960
|
+
"path": "packages/software-development/morning-routine",
|
|
961
|
+
"description": "Run the complete start-of-day setup in one pass: roll over unfinished Obsidian tasks to today's daily note, sync open GitHub PRs that need your attention, and sweep Dependabot patch bumps. Chains obsidian-task-rollover, obsidian-pr-sync, and dependabot-triage.",
|
|
962
|
+
"tags": [
|
|
963
|
+
"morning",
|
|
964
|
+
"obsidian",
|
|
965
|
+
"daily-note",
|
|
966
|
+
"github",
|
|
967
|
+
"dependabot",
|
|
968
|
+
"productivity",
|
|
969
|
+
"routine",
|
|
970
|
+
"automation"
|
|
971
|
+
],
|
|
972
|
+
"adapters": [
|
|
973
|
+
"codex",
|
|
974
|
+
"claude",
|
|
975
|
+
"cursor",
|
|
976
|
+
"copilot",
|
|
977
|
+
"grok"
|
|
978
|
+
]
|
|
979
|
+
},
|
|
980
|
+
{
|
|
981
|
+
"name": "release-day",
|
|
982
|
+
"lookupName": "olko:release-day",
|
|
983
|
+
"category": "software-development",
|
|
984
|
+
"path": "packages/software-development/release-day",
|
|
985
|
+
"description": "Orchestrate a full release-day workflow for iOS, Android, or Garmin apps: verify main branch CI is green, generate changelog, draft platform-ready store listing copy, trigger semantic-release or tag manually, wait for the build, and queue the App Store submission.",
|
|
986
|
+
"tags": [
|
|
987
|
+
"release",
|
|
988
|
+
"ios",
|
|
989
|
+
"android",
|
|
990
|
+
"garmin",
|
|
991
|
+
"app-store",
|
|
992
|
+
"changelog",
|
|
993
|
+
"store-listing",
|
|
994
|
+
"semantic-release",
|
|
995
|
+
"deployment",
|
|
996
|
+
"automation"
|
|
997
|
+
],
|
|
998
|
+
"adapters": [
|
|
999
|
+
"codex",
|
|
1000
|
+
"claude",
|
|
1001
|
+
"cursor",
|
|
1002
|
+
"copilot",
|
|
1003
|
+
"grok"
|
|
1004
|
+
]
|
|
1005
|
+
},
|
|
1006
|
+
{
|
|
1007
|
+
"name": "branch-cleanup",
|
|
1008
|
+
"lookupName": "olko:branch-cleanup",
|
|
1009
|
+
"category": "software-development",
|
|
1010
|
+
"path": "packages/software-development/branch-cleanup",
|
|
1011
|
+
"description": "Prune stale git branches after a merge wave: delete closed/merged remote branches, remove local tracking refs that no longer exist on the remote, and optionally clean up merged local branches. Natural follow-up to dependabot-triage.",
|
|
1012
|
+
"tags": [
|
|
1013
|
+
"git",
|
|
1014
|
+
"branches",
|
|
1015
|
+
"cleanup",
|
|
1016
|
+
"maintenance",
|
|
1017
|
+
"dependabot",
|
|
1018
|
+
"github"
|
|
1019
|
+
],
|
|
1020
|
+
"adapters": [
|
|
1021
|
+
"codex",
|
|
1022
|
+
"claude",
|
|
1023
|
+
"cursor",
|
|
1024
|
+
"copilot",
|
|
1025
|
+
"grok"
|
|
1026
|
+
]
|
|
933
1027
|
}
|
|
934
1028
|
]
|
|
935
1029
|
}
|