@olegkoval/agent-skills 1.19.0 → 1.20.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 (102) hide show
  1. package/.claude-plugin/plugin.json +3 -2
  2. package/.cursor-plugin/index.json +5 -0
  3. package/.grok-plugin/index.json +5 -0
  4. package/.kiro/steering/garmin-watchface.md +201 -0
  5. package/.kiro/steering/qodoloop.md +13 -1
  6. package/.windsurf/rules/garmin-watchface.md +200 -0
  7. package/.windsurf/rules/qodoloop.md +13 -1
  8. package/README.md +7 -1
  9. package/catalog/skills.json +28 -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/qodoloop/SKILL.md +13 -1
  19. package/packages/software-development/qodoloop/adapters/claude/skills/qodoloop/SKILL.md +13 -1
  20. package/packages/software-development/qodoloop/adapters/claude/skills/qodoloop/references/graphql-queries.md +151 -0
  21. package/packages/software-development/qodoloop/adapters/cursor/skills/qodoloop/SKILL.md +13 -1
  22. package/packages/software-development/qodoloop/adapters/cursor/skills/qodoloop/references/graphql-queries.md +151 -0
  23. package/packages/software-development/qodoloop/adapters/grok/skills/qodoloop/SKILL.md +13 -1
  24. package/packages/software-development/qodoloop/adapters/grok/skills/qodoloop/references/graphql-queries.md +151 -0
  25. package/packages/software-development/qodoloop/adapters/kiro/steering/qodoloop.md +13 -1
  26. package/packages/software-development/qodoloop/adapters/windsurf/rules/qodoloop.md +13 -1
  27. package/packages/software-development/semantic-release-beta/adapters/claude/skills/semantic-release-beta/references/github-actions.md +16 -0
  28. package/packages/software-development/semantic-release-beta/adapters/claude/skills/semantic-release-beta/references/node-semantic-release.md +13 -0
  29. package/packages/software-development/semantic-release-beta/adapters/claude/skills/semantic-release-beta/references/preset.md +47 -0
  30. package/packages/software-development/semantic-release-beta/adapters/claude/skills/semantic-release-beta/references/validation.md +17 -0
  31. package/packages/software-development/semantic-release-beta/adapters/cursor/skills/semantic-release-beta/references/github-actions.md +16 -0
  32. package/packages/software-development/semantic-release-beta/adapters/cursor/skills/semantic-release-beta/references/node-semantic-release.md +13 -0
  33. package/packages/software-development/semantic-release-beta/adapters/cursor/skills/semantic-release-beta/references/preset.md +47 -0
  34. package/packages/software-development/semantic-release-beta/adapters/cursor/skills/semantic-release-beta/references/validation.md +17 -0
  35. package/packages/software-development/semantic-release-beta/adapters/grok/skills/semantic-release-beta/references/github-actions.md +16 -0
  36. package/packages/software-development/semantic-release-beta/adapters/grok/skills/semantic-release-beta/references/node-semantic-release.md +13 -0
  37. package/packages/software-development/semantic-release-beta/adapters/grok/skills/semantic-release-beta/references/preset.md +47 -0
  38. package/packages/software-development/semantic-release-beta/adapters/grok/skills/semantic-release-beta/references/validation.md +17 -0
  39. package/packages/wearables/garmin-watchface/SKILL.md +204 -0
  40. package/packages/wearables/garmin-watchface/adapters/claude/plugin.json +5 -0
  41. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/SKILL.md +205 -0
  42. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/references/devices.md +98 -0
  43. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/references/display.md +120 -0
  44. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/references/layout.md +224 -0
  45. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/references/simulator.md +146 -0
  46. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/references/store.md +151 -0
  47. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/references/testing.md +154 -0
  48. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/scripts/ciq-calibrate +184 -0
  49. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/scripts/ciq-capture +215 -0
  50. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/scripts/ciq-devices +177 -0
  51. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/scripts/ciq-doctor +85 -0
  52. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/templates/Makefile +72 -0
  53. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/templates/monkey.jungle +13 -0
  54. package/packages/wearables/garmin-watchface/adapters/claude/skills/garmin-watchface/templates/monkey.test.jungle +7 -0
  55. package/packages/wearables/garmin-watchface/adapters/codex/README.md +3 -0
  56. package/packages/wearables/garmin-watchface/adapters/cursor/plugin.json +6 -0
  57. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/SKILL.md +205 -0
  58. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/references/devices.md +98 -0
  59. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/references/display.md +120 -0
  60. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/references/layout.md +224 -0
  61. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/references/simulator.md +146 -0
  62. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/references/store.md +151 -0
  63. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/references/testing.md +154 -0
  64. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/scripts/ciq-calibrate +184 -0
  65. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/scripts/ciq-capture +215 -0
  66. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/scripts/ciq-devices +177 -0
  67. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/scripts/ciq-doctor +85 -0
  68. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/templates/Makefile +72 -0
  69. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/templates/monkey.jungle +13 -0
  70. package/packages/wearables/garmin-watchface/adapters/cursor/skills/garmin-watchface/templates/monkey.test.jungle +7 -0
  71. package/packages/wearables/garmin-watchface/adapters/grok/plugin.json +6 -0
  72. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/SKILL.md +205 -0
  73. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/references/devices.md +98 -0
  74. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/references/display.md +120 -0
  75. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/references/layout.md +224 -0
  76. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/references/simulator.md +146 -0
  77. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/references/store.md +151 -0
  78. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/references/testing.md +154 -0
  79. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/scripts/ciq-calibrate +184 -0
  80. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/scripts/ciq-capture +215 -0
  81. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/scripts/ciq-devices +177 -0
  82. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/scripts/ciq-doctor +85 -0
  83. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/templates/Makefile +72 -0
  84. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/templates/monkey.jungle +13 -0
  85. package/packages/wearables/garmin-watchface/adapters/grok/skills/garmin-watchface/templates/monkey.test.jungle +7 -0
  86. package/packages/wearables/garmin-watchface/adapters/kiro/steering/garmin-watchface.md +201 -0
  87. package/packages/wearables/garmin-watchface/adapters/windsurf/rules/garmin-watchface.md +200 -0
  88. package/packages/wearables/garmin-watchface/references/devices.md +98 -0
  89. package/packages/wearables/garmin-watchface/references/display.md +120 -0
  90. package/packages/wearables/garmin-watchface/references/layout.md +224 -0
  91. package/packages/wearables/garmin-watchface/references/simulator.md +146 -0
  92. package/packages/wearables/garmin-watchface/references/store.md +151 -0
  93. package/packages/wearables/garmin-watchface/references/testing.md +154 -0
  94. package/packages/wearables/garmin-watchface/scripts/ciq-calibrate +184 -0
  95. package/packages/wearables/garmin-watchface/scripts/ciq-capture +215 -0
  96. package/packages/wearables/garmin-watchface/scripts/ciq-devices +177 -0
  97. package/packages/wearables/garmin-watchface/scripts/ciq-doctor +85 -0
  98. package/packages/wearables/garmin-watchface/templates/Makefile +72 -0
  99. package/packages/wearables/garmin-watchface/templates/monkey.jungle +13 -0
  100. package/packages/wearables/garmin-watchface/templates/monkey.test.jungle +7 -0
  101. package/scripts/build-adapters.sh +1 -1
  102. package/scripts/validate-catalog.sh +2 -1
@@ -34,7 +34,19 @@ Qodo has **no check run to poll** — there is nothing in `gh pr checks` to wait
34
34
  gh pr view --json number,headRefName,headRefOid -q '{number, branch: .headRefName, sha: .headRefOid}'
35
35
  ```
36
36
 
37
- Check out the branch if not already on it.
37
+ Check out the branch if not already on it, **then require a clean working
38
+ tree** (`git status --porcelain` empty) before touching anything:
39
+
40
+ ```bash
41
+ [ -z "$(git status --porcelain)" ] || { echo "working tree not clean — refusing to start, would risk committing unrelated changes"; exit 1; }
42
+ ```
43
+
44
+ This is the precondition step E's scoped `git add <file>` depends on: staging
45
+ only the files a fix touched is safe *because* the tree started clean, so
46
+ nothing else could be sitting in those files. Skip this check and a file
47
+ with pre-existing local edits will have those edits swept into the fix
48
+ commit right along with it — the exact failure `git add -A` had, just
49
+ narrower.
38
50
 
39
51
  ### 2. Loop (max 5 iterations)
40
52
 
@@ -0,0 +1,16 @@
1
+ # GitHub Actions layout
2
+
3
+ Recommended jobs:
4
+
5
+ - `test`
6
+ - `release-readiness`
7
+ - `release`
8
+
9
+ Core behavior:
10
+
11
+ - run on `push` and `pull_request` for `main` and `beta`
12
+ - use `fetch-depth: 0` for semantic-release jobs
13
+ - validate `NPM_TOKEN`
14
+ - run `npm run release:dry-run` before the real release
15
+ - run the real release with `npm run semantic-release` or the repository's equivalent semantic-release script
16
+ - use a Node version compatible with `semantic-release-npm-github-publish` and its semantic-release peer dependencies
@@ -0,0 +1,13 @@
1
+ # Node semantic-release config
2
+
3
+ Use this pattern when a Node package should publish stable releases from `main` and prereleases from `beta`.
4
+
5
+ Prefer the `semantic-release-npm-github-publish` shareable config for the plugin chain. Keep branch policy in repo-local config because the preset is intentionally branch-agnostic for consumers.
6
+
7
+ ## Core points
8
+
9
+ - add `release:dry-run` as `semantic-release --dry-run --no-ci`
10
+ - add `semantic-release` as `semantic-release` if the repository does not already have a release script
11
+ - configure branches for `main` and `{ name: "beta", channel: "beta", prerelease: "beta" }`
12
+ - extend `semantic-release-npm-github-publish` unless the project requires a different plugin composition
13
+ - preserve existing custom plugins only when they represent intentional behavior not covered by the preset
@@ -0,0 +1,47 @@
1
+ # semantic-release-npm-github-publish preset
2
+
3
+ Use `semantic-release-npm-github-publish` as the default release preset for npm + GitHub packages.
4
+
5
+ ## What it provides
6
+
7
+ - a maintained semantic-release shareable configuration
8
+ - changelog generation
9
+ - npm publishing
10
+ - GitHub release publishing
11
+ - release commits for `package.json`, `package-lock.json`, and `CHANGELOG.md`
12
+ - extra patch release rules for maintenance commit types such as `build`, `ci`, `chore`, `docs`, `refactor`, `style`, and `test`
13
+ - tested support for current semantic-release plugin majors on Node 22 and 24
14
+
15
+ ## Install
16
+
17
+ Install the preset plus semantic-release and its peer plugins:
18
+
19
+ ```bash
20
+ npm install --save-dev \
21
+ semantic-release \
22
+ semantic-release-npm-github-publish \
23
+ @semantic-release/changelog \
24
+ @semantic-release/commit-analyzer \
25
+ @semantic-release/git \
26
+ @semantic-release/github \
27
+ @semantic-release/npm \
28
+ @semantic-release/release-notes-generator
29
+ ```
30
+
31
+ ## Repo-local config
32
+
33
+ The preset does not hardcode consumer release branches. Keep branch policy in the target repository:
34
+
35
+ ```yaml
36
+ branches:
37
+ - main
38
+ - name: beta
39
+ channel: beta
40
+ prerelease: beta
41
+ extends: semantic-release-npm-github-publish
42
+ ci: false
43
+ dryRun: false
44
+ debug: false
45
+ ```
46
+
47
+ Use a different local config only when the target repository intentionally needs a different plugin chain, release rules, or upgrade policy.
@@ -0,0 +1,17 @@
1
+ # Validation
2
+
3
+ Prefer these checks:
4
+
5
+ ```bash
6
+ npm test
7
+ npm run build
8
+ npm run release:dry-run
9
+ ```
10
+
11
+ Common failure points:
12
+
13
+ - missing `fetch-depth: 0`
14
+ - invalid or missing `NPM_TOKEN`
15
+ - missing `beta` branch config
16
+ - missing `semantic-release-npm-github-publish` or one of its peer plugins
17
+ - plugin config drifting from actual repo files
@@ -0,0 +1,16 @@
1
+ # GitHub Actions layout
2
+
3
+ Recommended jobs:
4
+
5
+ - `test`
6
+ - `release-readiness`
7
+ - `release`
8
+
9
+ Core behavior:
10
+
11
+ - run on `push` and `pull_request` for `main` and `beta`
12
+ - use `fetch-depth: 0` for semantic-release jobs
13
+ - validate `NPM_TOKEN`
14
+ - run `npm run release:dry-run` before the real release
15
+ - run the real release with `npm run semantic-release` or the repository's equivalent semantic-release script
16
+ - use a Node version compatible with `semantic-release-npm-github-publish` and its semantic-release peer dependencies
@@ -0,0 +1,13 @@
1
+ # Node semantic-release config
2
+
3
+ Use this pattern when a Node package should publish stable releases from `main` and prereleases from `beta`.
4
+
5
+ Prefer the `semantic-release-npm-github-publish` shareable config for the plugin chain. Keep branch policy in repo-local config because the preset is intentionally branch-agnostic for consumers.
6
+
7
+ ## Core points
8
+
9
+ - add `release:dry-run` as `semantic-release --dry-run --no-ci`
10
+ - add `semantic-release` as `semantic-release` if the repository does not already have a release script
11
+ - configure branches for `main` and `{ name: "beta", channel: "beta", prerelease: "beta" }`
12
+ - extend `semantic-release-npm-github-publish` unless the project requires a different plugin composition
13
+ - preserve existing custom plugins only when they represent intentional behavior not covered by the preset
@@ -0,0 +1,47 @@
1
+ # semantic-release-npm-github-publish preset
2
+
3
+ Use `semantic-release-npm-github-publish` as the default release preset for npm + GitHub packages.
4
+
5
+ ## What it provides
6
+
7
+ - a maintained semantic-release shareable configuration
8
+ - changelog generation
9
+ - npm publishing
10
+ - GitHub release publishing
11
+ - release commits for `package.json`, `package-lock.json`, and `CHANGELOG.md`
12
+ - extra patch release rules for maintenance commit types such as `build`, `ci`, `chore`, `docs`, `refactor`, `style`, and `test`
13
+ - tested support for current semantic-release plugin majors on Node 22 and 24
14
+
15
+ ## Install
16
+
17
+ Install the preset plus semantic-release and its peer plugins:
18
+
19
+ ```bash
20
+ npm install --save-dev \
21
+ semantic-release \
22
+ semantic-release-npm-github-publish \
23
+ @semantic-release/changelog \
24
+ @semantic-release/commit-analyzer \
25
+ @semantic-release/git \
26
+ @semantic-release/github \
27
+ @semantic-release/npm \
28
+ @semantic-release/release-notes-generator
29
+ ```
30
+
31
+ ## Repo-local config
32
+
33
+ The preset does not hardcode consumer release branches. Keep branch policy in the target repository:
34
+
35
+ ```yaml
36
+ branches:
37
+ - main
38
+ - name: beta
39
+ channel: beta
40
+ prerelease: beta
41
+ extends: semantic-release-npm-github-publish
42
+ ci: false
43
+ dryRun: false
44
+ debug: false
45
+ ```
46
+
47
+ Use a different local config only when the target repository intentionally needs a different plugin chain, release rules, or upgrade policy.
@@ -0,0 +1,17 @@
1
+ # Validation
2
+
3
+ Prefer these checks:
4
+
5
+ ```bash
6
+ npm test
7
+ npm run build
8
+ npm run release:dry-run
9
+ ```
10
+
11
+ Common failure points:
12
+
13
+ - missing `fetch-depth: 0`
14
+ - invalid or missing `NPM_TOKEN`
15
+ - missing `beta` branch config
16
+ - missing `semantic-release-npm-github-publish` or one of its peer plugins
17
+ - plugin config drifting from actual repo files
@@ -0,0 +1,16 @@
1
+ # GitHub Actions layout
2
+
3
+ Recommended jobs:
4
+
5
+ - `test`
6
+ - `release-readiness`
7
+ - `release`
8
+
9
+ Core behavior:
10
+
11
+ - run on `push` and `pull_request` for `main` and `beta`
12
+ - use `fetch-depth: 0` for semantic-release jobs
13
+ - validate `NPM_TOKEN`
14
+ - run `npm run release:dry-run` before the real release
15
+ - run the real release with `npm run semantic-release` or the repository's equivalent semantic-release script
16
+ - use a Node version compatible with `semantic-release-npm-github-publish` and its semantic-release peer dependencies
@@ -0,0 +1,13 @@
1
+ # Node semantic-release config
2
+
3
+ Use this pattern when a Node package should publish stable releases from `main` and prereleases from `beta`.
4
+
5
+ Prefer the `semantic-release-npm-github-publish` shareable config for the plugin chain. Keep branch policy in repo-local config because the preset is intentionally branch-agnostic for consumers.
6
+
7
+ ## Core points
8
+
9
+ - add `release:dry-run` as `semantic-release --dry-run --no-ci`
10
+ - add `semantic-release` as `semantic-release` if the repository does not already have a release script
11
+ - configure branches for `main` and `{ name: "beta", channel: "beta", prerelease: "beta" }`
12
+ - extend `semantic-release-npm-github-publish` unless the project requires a different plugin composition
13
+ - preserve existing custom plugins only when they represent intentional behavior not covered by the preset
@@ -0,0 +1,47 @@
1
+ # semantic-release-npm-github-publish preset
2
+
3
+ Use `semantic-release-npm-github-publish` as the default release preset for npm + GitHub packages.
4
+
5
+ ## What it provides
6
+
7
+ - a maintained semantic-release shareable configuration
8
+ - changelog generation
9
+ - npm publishing
10
+ - GitHub release publishing
11
+ - release commits for `package.json`, `package-lock.json`, and `CHANGELOG.md`
12
+ - extra patch release rules for maintenance commit types such as `build`, `ci`, `chore`, `docs`, `refactor`, `style`, and `test`
13
+ - tested support for current semantic-release plugin majors on Node 22 and 24
14
+
15
+ ## Install
16
+
17
+ Install the preset plus semantic-release and its peer plugins:
18
+
19
+ ```bash
20
+ npm install --save-dev \
21
+ semantic-release \
22
+ semantic-release-npm-github-publish \
23
+ @semantic-release/changelog \
24
+ @semantic-release/commit-analyzer \
25
+ @semantic-release/git \
26
+ @semantic-release/github \
27
+ @semantic-release/npm \
28
+ @semantic-release/release-notes-generator
29
+ ```
30
+
31
+ ## Repo-local config
32
+
33
+ The preset does not hardcode consumer release branches. Keep branch policy in the target repository:
34
+
35
+ ```yaml
36
+ branches:
37
+ - main
38
+ - name: beta
39
+ channel: beta
40
+ prerelease: beta
41
+ extends: semantic-release-npm-github-publish
42
+ ci: false
43
+ dryRun: false
44
+ debug: false
45
+ ```
46
+
47
+ Use a different local config only when the target repository intentionally needs a different plugin chain, release rules, or upgrade policy.
@@ -0,0 +1,17 @@
1
+ # Validation
2
+
3
+ Prefer these checks:
4
+
5
+ ```bash
6
+ npm test
7
+ npm run build
8
+ npm run release:dry-run
9
+ ```
10
+
11
+ Common failure points:
12
+
13
+ - missing `fetch-depth: 0`
14
+ - invalid or missing `NPM_TOKEN`
15
+ - missing `beta` branch config
16
+ - missing `semantic-release-npm-github-publish` or one of its peer plugins
17
+ - plugin config drifting from actual repo files
@@ -0,0 +1,204 @@
1
+ ---
2
+ name: garmin-watchface
3
+ description: Build, test, screenshot and publish Garmin Connect IQ watch faces in Monkey C. Use when working on a Connect IQ watch face or app - creating one, fixing layout that clips or overlaps, capturing simulator screenshots, adding app settings, widening device support, or preparing a Connect IQ Store submission. Encodes the traps that silently produce a passing build and a broken face.
4
+ license: MIT
5
+ allowed-tools: Bash, Read, Write, Edit, Grep, Glob
6
+ compatibility: Codex, Claude Code, Cursor, GitHub Copilot, Windsurf, Kiro, and other Agent Skills compatible tools. Requires macOS, the Connect IQ SDK, a JDK, and Python 3 (Pillow for screenshot cropping).
7
+ metadata:
8
+ targets: [_source-only]
9
+ ---
10
+
11
+ # Garmin Connect IQ watch faces
12
+
13
+ Monkey C gives you almost no safety net. The compiler is happy to build a face
14
+ that draws off the bottom of the screen, a test suite that contains no tests, and
15
+ a colour that is not the colour you get. Everything below is a failure mode that
16
+ looked like success first.
17
+
18
+ **Read `references/` files as needed — do not read them all up front.**
19
+
20
+ | File | When |
21
+ | --- | --- |
22
+ | `references/display.md` | Choosing colours, anything about brightness or legibility |
23
+ | `references/layout.md` | Positioning anything; content clipped, overlapping, or off-screen |
24
+ | `references/testing.md` | Writing tests; a suspiciously clean test run |
25
+ | `references/simulator.md` | Screenshots, settings not applying, monkeydo hanging |
26
+ | `references/devices.md` | Adding device support, launcher icons, API levels |
27
+ | `references/store.md` | Publishing, listing copy, IP questions |
28
+
29
+ ## Tools
30
+
31
+ Run these rather than reinventing them. All are standalone.
32
+
33
+ ```bash
34
+ <skill-dir>/scripts/ciq-doctor # toolchain check: SDK, JDK, key, devices
35
+ <skill-dir>/scripts/ciq-devices # survey installed devices by resolution
36
+ <skill-dir>/scripts/ciq-devices --same-as fenix6pro # products you can add with no code change
37
+ <skill-dir>/scripts/ciq-capture out.png # calibrated simulator screenshot
38
+ <skill-dir>/scripts/ciq-capture out.png --face --size 260 # cropped + masked to the round display
39
+ <skill-dir>/scripts/ciq-calibrate # re-derive the display rect if capture looks wrong
40
+ ```
41
+
42
+ `<skill-dir>/scripts/ciq-capture` exists because `screencapture -R` grabs a screen *region*, not
43
+ a window: without a frontmost check it silently photographs whatever is on top,
44
+ and the window moves between simulator restarts. Both failure modes produce a
45
+ plausible PNG of the wrong thing.
46
+
47
+ ## The five things that will bite you
48
+
49
+ ### 1. `make test` can compile zero tests and report success
50
+
51
+ If `monkey.jungle` sets `base.excludeAnnotations = test`, every `(:test)`
52
+ function is stripped from **every** target, including the unit-test build. You
53
+ get `BUILD SUCCESSFUL` and a green run with nothing compiled — even when the test
54
+ files reference symbols that no longer exist.
55
+
56
+ Fix: a second jungle passed as an additional `-f`. See
57
+ `<skill-dir>/templates/monkey.test.jungle` and the `test` target in `<skill-dir>/templates/Makefile`.
58
+
59
+ **Prove it before you trust it.** Put a deliberately unresolvable symbol in one
60
+ test and confirm the build fails:
61
+
62
+ ```monkeyc
63
+ return ThisDoesNotExist.definitelyNotAFunction();
64
+ ```
65
+
66
+ ### 2. Never hardcode a Y coordinate or assume a font height
67
+
68
+ `dc.getFontHeight()` is the only source of truth, and the numbers are larger than
69
+ they look. Measured on fenix 6 Pro:
70
+
71
+ | Font | Height |
72
+ | --- | --- |
73
+ | `FONT_XTINY` | 19 |
74
+ | `FONT_TINY` | 29 |
75
+ | `FONT_SMALL` | 32 |
76
+ | `FONT_NUMBER_MEDIUM` | 74 |
77
+
78
+ Content drawn past the screen height is simply invisible — no error, no warning,
79
+ no clipping indicator. A two-line `FONT_NUMBER_MEDIUM` block is 148px of a 260px
80
+ face.
81
+
82
+ Derive every Y at draw time, and **clamp** so a bottom row cannot be pushed off:
83
+
84
+ ```monkeyc
85
+ function clampRuleY(derived as Number, footerH as Number) as Number {
86
+ var reserved = (footerH * 2) + GAP_BELOW_RULE + GAP_BETWEEN_ROWS;
87
+ var maxRuleY = SCREEN - BOTTOM_MARGIN - reserved;
88
+ return derived > maxRuleY ? maxRuleY : derived;
89
+ }
90
+ ```
91
+
92
+ See `references/layout.md`.
93
+
94
+ ### 3. The screen is round; your layout is not
95
+
96
+ Check content against the bezel curve, not the bounding square. A rectangle
97
+ inscribed in a circle fails at its **corners** long before its sides.
98
+
99
+ ```monkeyc
100
+ function halfWidthAt(y as Number) as Number {
101
+ var dy = y - CENTER;
102
+ var inside = (CENTER * CENTER) - (dy * dy);
103
+ return inside <= 0 ? 0 : Math.sqrt(inside).toNumber();
104
+ }
105
+ ```
106
+
107
+ ### 4. Colours are quantised, and brightness is reflectance
108
+
109
+ Many devices snap to a 4×4×4 lattice: `0x00 / 0x55 / 0xAA / 0xFF` per channel. A
110
+ colour not already on it is not the colour that ships.
111
+
112
+ More important: MIP screens are **transflective with no backlight**. A colour's
113
+ brightness *is* how much ambient light it returns. Grey reflects about two-thirds
114
+ of what white does. Choosing a photographically accurate grey for a large area
115
+ makes the whole face read as dim on the wrist while looking fine in the
116
+ simulator's backlit LCD.
117
+
118
+ Corollary: a saturated colour on a glyph reflects only its own channel, making
119
+ the thing you want to read the *dimmest* thing on screen.
120
+
121
+ See `references/display.md`.
122
+
123
+ ### 5. The simulator lies about settings
124
+
125
+ It persists app settings and **ignores changed defaults in `properties.xml`**
126
+ until you do File → Reset All App Data. A property will keep reading its old
127
+ value while the XML plainly says otherwise. This looks exactly like broken
128
+ settings code.
129
+
130
+ Reset also drops the loaded device, so relaunch and re-push afterwards.
131
+
132
+ See `references/simulator.md`.
133
+
134
+ ## Workflow
135
+
136
+ ### Starting a face
137
+
138
+ 1. `<skill-dir>/scripts/ciq-doctor` — confirm SDK, JDK, developer key, target device installed.
139
+ 2. Copy `<skill-dir>/templates/Makefile`, `<skill-dir>/templates/monkey.jungle`, `<skill-dir>/templates/monkey.test.jungle`.
140
+ 3. Generate a fresh app id: `python3 -c "import uuid;print(uuid.uuid4().hex)"`.
141
+ 4. Split source by responsibility. This structure has held up well:
142
+
143
+ | Module | Holds |
144
+ | --- | --- |
145
+ | `Palette.mc` | Colours only, all lattice-exact |
146
+ | `Layout.mc` | Geometry, derivations, bezel maths — no drawing |
147
+ | `<Widget>.mc` | Drawing primitives (rows, bars, segments) |
148
+ | `Fields.mc` | Formatting and thresholds — pure, easy to test |
149
+ | `Sensors.mc` | Sensor reads with null handling |
150
+ | `<Name>View.mc` | Composition only |
151
+
152
+ Keeping `Layout` free of `Dc` calls is what makes geometry unit-testable.
153
+
154
+ ### Every change
155
+
156
+ ```bash
157
+ make build && make test && make lint
158
+ ```
159
+
160
+ `make lint` is level 3 and catches real problems the level 2 build allows.
161
+
162
+ ### Before committing
163
+
164
+ Capture and *look at it*. Layout bugs are invisible in a passing test run:
165
+
166
+ ```bash
167
+ make build && make sim
168
+ <skill-dir>/scripts/ciq-capture /tmp/face.png --face --size 260
169
+ ```
170
+
171
+ Then Read the PNG. Every layout bug in this skill's history was found by looking,
172
+ not by testing.
173
+
174
+ ## Monkey C gotchas
175
+
176
+ - Module-level functions take **no** visibility modifier. `private` and `hidden`
177
+ are class-only; at module scope they are syntax errors.
178
+ - `dc.fillPolygon` wants `Array<[Numeric, Numeric]>`. Cast the literal:
179
+ `[[x, y], ...] as Array<[Numeric, Numeric]>`.
180
+ - `getInitialView()` returns
181
+ `[WatchUi.Views] or [WatchUi.Views, WatchUi.InputDelegates]`.
182
+ - `Application.Properties.getValue()` **throws** when a key is absent, which
183
+ happens on a fresh install before settings have ever been written. Wrap every
184
+ read with a default.
185
+ - Integer division everywhere. Centring an odd width leaves a 1px skew — write
186
+ tests that allow it rather than forcing constants to stay even.
187
+
188
+ ## Reference watches and homages
189
+
190
+ If reproducing a real object, get these right before anything else, because they
191
+ are what makes it recognisable:
192
+
193
+ - **Display polarity.** A 1970s LCD is *positive*: dark segments on a pale panel,
194
+ the inverse of every modern face. Getting this backwards turns a crystal into a
195
+ screen.
196
+ - **Proportion.** Bezels on vintage digitals are thick; the window is smaller
197
+ than memory suggests.
198
+ - **Where the legends sit** — maker's name on the bezel, not the glass.
199
+
200
+ No system font is a segment display. If you need one, draw it: see
201
+ `references/layout.md` for a working seven-segment renderer, including the ghost
202
+ (unlit) segments that are most of what sells the effect.
203
+
204
+ **Do not print a real brand on the face.** See `references/store.md`.
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "olko-garmin-watchface",
3
+ "description": "Build, test, screenshot and publish Garmin Connect IQ watch faces in Monkey C.",
4
+ "skills": "./skills"
5
+ }