@rune-kit/rune 2.10.0 → 2.12.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 (240) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +65 -6
  3. package/commands/rune.md +168 -168
  4. package/compiler/__tests__/detect-invariants.test.js +136 -0
  5. package/compiler/__tests__/doctor-mesh.test.js +229 -0
  6. package/compiler/__tests__/hook-dispatch.test.js +91 -0
  7. package/compiler/__tests__/hooks-antigravity.test.js +118 -0
  8. package/compiler/__tests__/hooks-cursor.test.js +139 -0
  9. package/compiler/__tests__/hooks-install.test.js +305 -0
  10. package/compiler/__tests__/hooks-merge.test.js +204 -0
  11. package/compiler/__tests__/hooks-tiers.test.js +519 -0
  12. package/compiler/__tests__/hooks-windsurf.test.js +115 -0
  13. package/compiler/__tests__/inject-claude-md.test.js +152 -0
  14. package/compiler/__tests__/load-invariants.test.js +408 -0
  15. package/compiler/__tests__/onboard-invariants.test.js +240 -0
  16. package/compiler/adapters/hooks/antigravity.js +140 -0
  17. package/compiler/adapters/hooks/claude.js +166 -0
  18. package/compiler/adapters/hooks/cursor.js +191 -0
  19. package/compiler/adapters/hooks/index.js +82 -0
  20. package/compiler/adapters/hooks/tier-emitter.js +182 -0
  21. package/compiler/adapters/hooks/windsurf.js +202 -0
  22. package/compiler/bin/rune.js +196 -6
  23. package/compiler/commands/hook-dispatch.js +87 -0
  24. package/compiler/commands/hooks/install.js +120 -0
  25. package/compiler/commands/hooks/merge.js +211 -0
  26. package/compiler/commands/hooks/presets.js +116 -0
  27. package/compiler/commands/hooks/status.js +112 -0
  28. package/compiler/commands/hooks/tiers.js +221 -0
  29. package/compiler/commands/hooks/uninstall.js +94 -0
  30. package/compiler/doctor.js +236 -0
  31. package/contexts/dev.md +34 -34
  32. package/contexts/research.md +43 -43
  33. package/contexts/review.md +55 -55
  34. package/extensions/ai-ml/PACK.md +88 -88
  35. package/extensions/ai-ml/skills/ai-agents.md +172 -172
  36. package/extensions/ai-ml/skills/code-sandbox.md +187 -187
  37. package/extensions/ai-ml/skills/deep-research.md +146 -146
  38. package/extensions/ai-ml/skills/embedding-search.md +66 -66
  39. package/extensions/ai-ml/skills/fine-tuning-guide.md +74 -74
  40. package/extensions/ai-ml/skills/llm-architect.md +125 -125
  41. package/extensions/ai-ml/skills/llm-integration.md +64 -64
  42. package/extensions/ai-ml/skills/prompt-patterns.md +72 -72
  43. package/extensions/ai-ml/skills/rag-patterns.md +66 -66
  44. package/extensions/ai-ml/skills/web-extraction.md +114 -114
  45. package/extensions/analytics/PACK.md +92 -92
  46. package/extensions/analytics/skills/ab-testing.md +72 -72
  47. package/extensions/analytics/skills/dashboard-patterns.md +83 -83
  48. package/extensions/analytics/skills/data-validation.md +68 -68
  49. package/extensions/analytics/skills/funnel-analysis.md +81 -81
  50. package/extensions/analytics/skills/sql-patterns.md +57 -57
  51. package/extensions/analytics/skills/statistical-analysis.md +79 -79
  52. package/extensions/analytics/skills/tracking-setup.md +71 -71
  53. package/extensions/backend/PACK.md +104 -104
  54. package/extensions/backend/skills/api-patterns.md +84 -84
  55. package/extensions/backend/skills/async-pipeline.md +193 -193
  56. package/extensions/backend/skills/auth-patterns.md +97 -97
  57. package/extensions/backend/skills/background-jobs.md +133 -133
  58. package/extensions/backend/skills/caching-patterns.md +108 -108
  59. package/extensions/backend/skills/cli-generation.md +133 -133
  60. package/extensions/backend/skills/database-patterns.md +87 -87
  61. package/extensions/backend/skills/middleware-patterns.md +104 -104
  62. package/extensions/chrome-ext/PACK.md +93 -93
  63. package/extensions/chrome-ext/skills/cws-preflight.md +143 -143
  64. package/extensions/chrome-ext/skills/cws-publish.md +104 -104
  65. package/extensions/chrome-ext/skills/ext-ai-integration.md +251 -251
  66. package/extensions/chrome-ext/skills/ext-messaging.md +139 -139
  67. package/extensions/chrome-ext/skills/ext-storage.md +133 -133
  68. package/extensions/chrome-ext/skills/mv3-scaffold.md +164 -164
  69. package/extensions/content/PACK.md +96 -96
  70. package/extensions/content/skills/blog-patterns.md +88 -88
  71. package/extensions/content/skills/cms-integration.md +131 -131
  72. package/extensions/content/skills/content-scoring.md +107 -107
  73. package/extensions/content/skills/i18n.md +83 -83
  74. package/extensions/content/skills/mdx-authoring.md +137 -137
  75. package/extensions/content/skills/reference.md +1014 -1014
  76. package/extensions/content/skills/seo-patterns.md +67 -67
  77. package/extensions/content/skills/video-repurpose.md +153 -153
  78. package/extensions/devops/PACK.md +101 -101
  79. package/extensions/devops/skills/chaos-testing.md +67 -67
  80. package/extensions/devops/skills/ci-cd.md +75 -75
  81. package/extensions/devops/skills/docker.md +58 -58
  82. package/extensions/devops/skills/edge-serverless.md +163 -163
  83. package/extensions/devops/skills/infra-as-code.md +158 -158
  84. package/extensions/devops/skills/kubernetes.md +110 -110
  85. package/extensions/devops/skills/monitoring.md +57 -57
  86. package/extensions/devops/skills/server-setup.md +64 -64
  87. package/extensions/devops/skills/ssl-domain.md +42 -42
  88. package/extensions/ecommerce/PACK.md +116 -116
  89. package/extensions/ecommerce/skills/cart-system.md +79 -79
  90. package/extensions/ecommerce/skills/inventory-mgmt.md +102 -102
  91. package/extensions/ecommerce/skills/order-management.md +126 -126
  92. package/extensions/ecommerce/skills/payment-integration.md +472 -472
  93. package/extensions/ecommerce/skills/shopify-dev.md +69 -69
  94. package/extensions/ecommerce/skills/subscription-billing.md +93 -93
  95. package/extensions/ecommerce/skills/tax-compliance.md +117 -117
  96. package/extensions/gamedev/PACK.md +142 -142
  97. package/extensions/gamedev/skills/asset-pipeline.md +74 -74
  98. package/extensions/gamedev/skills/audio-system.md +129 -129
  99. package/extensions/gamedev/skills/camera-system.md +87 -87
  100. package/extensions/gamedev/skills/ecs.md +98 -98
  101. package/extensions/gamedev/skills/game-loops.md +72 -72
  102. package/extensions/gamedev/skills/input-system.md +199 -199
  103. package/extensions/gamedev/skills/multiplayer.md +180 -180
  104. package/extensions/gamedev/skills/particles.md +105 -105
  105. package/extensions/gamedev/skills/physics-engine.md +89 -89
  106. package/extensions/gamedev/skills/scene-management.md +146 -146
  107. package/extensions/gamedev/skills/threejs-patterns.md +90 -90
  108. package/extensions/gamedev/skills/webgl.md +71 -71
  109. package/extensions/mobile/PACK.md +106 -106
  110. package/extensions/mobile/skills/app-store-connect.md +152 -152
  111. package/extensions/mobile/skills/app-store-prep.md +66 -66
  112. package/extensions/mobile/skills/deep-linking.md +109 -109
  113. package/extensions/mobile/skills/flutter.md +60 -60
  114. package/extensions/mobile/skills/ios-build-pipeline.md +142 -142
  115. package/extensions/mobile/skills/native-bridge.md +66 -66
  116. package/extensions/mobile/skills/ota-updates.md +97 -97
  117. package/extensions/mobile/skills/push-notifications.md +111 -111
  118. package/extensions/mobile/skills/react-native.md +82 -82
  119. package/extensions/saas/PACK.md +116 -116
  120. package/extensions/saas/skills/billing-integration.md +200 -200
  121. package/extensions/saas/skills/feature-flags.md +130 -130
  122. package/extensions/saas/skills/multi-tenant.md +103 -103
  123. package/extensions/saas/skills/onboarding-flow.md +139 -139
  124. package/extensions/saas/skills/subscription-flow.md +95 -95
  125. package/extensions/saas/skills/team-management.md +144 -144
  126. package/extensions/security/PACK.md +99 -99
  127. package/extensions/security/skills/api-security.md +140 -140
  128. package/extensions/security/skills/compliance.md +68 -68
  129. package/extensions/security/skills/owasp-audit.md +64 -64
  130. package/extensions/security/skills/pentest-patterns.md +77 -77
  131. package/extensions/security/skills/secret-mgmt.md +65 -65
  132. package/extensions/security/skills/supply-chain.md +65 -65
  133. package/extensions/trading/PACK.md +80 -80
  134. package/extensions/trading/skills/chart-components.md +55 -55
  135. package/extensions/trading/skills/experiment-loop.md +125 -125
  136. package/extensions/trading/skills/fintech-patterns.md +47 -47
  137. package/extensions/trading/skills/indicator-library.md +58 -58
  138. package/extensions/trading/skills/quant-analysis.md +111 -111
  139. package/extensions/trading/skills/realtime-data.md +58 -58
  140. package/extensions/trading/skills/trade-logic.md +104 -104
  141. package/extensions/ui/PACK.md +130 -130
  142. package/extensions/ui/skills/a11y-audit.md +91 -91
  143. package/extensions/ui/skills/animation-patterns.md +127 -127
  144. package/extensions/ui/skills/component-patterns.md +100 -100
  145. package/extensions/ui/skills/design-decision.md +108 -108
  146. package/extensions/ui/skills/design-system.md +68 -68
  147. package/extensions/ui/skills/landing-patterns.md +155 -155
  148. package/extensions/ui/skills/palette-picker.md +173 -173
  149. package/extensions/ui/skills/react-health.md +90 -90
  150. package/extensions/ui/skills/type-system.md +125 -125
  151. package/extensions/ui/skills/web-vitals.md +153 -153
  152. package/extensions/zalo/PACK.md +145 -145
  153. package/extensions/zalo/skills/zalo-oa-mcp.md +317 -317
  154. package/extensions/zalo/skills/zalo-oa-messaging.md +429 -429
  155. package/extensions/zalo/skills/zalo-oa-setup.md +236 -236
  156. package/extensions/zalo/skills/zalo-oa-webhook.md +189 -189
  157. package/extensions/zalo/skills/zalo-personal-messaging.md +194 -194
  158. package/extensions/zalo/skills/zalo-personal-setup.md +153 -153
  159. package/extensions/zalo/skills/zalo-rate-guard.md +219 -219
  160. package/hooks/auto-format/index.cjs +48 -48
  161. package/hooks/hooks.json +111 -111
  162. package/hooks/post-session-reflect/index.cjs +189 -189
  163. package/hooks/pre-compact/index.cjs +95 -95
  164. package/hooks/run-hook.cmd +1 -1
  165. package/hooks/secrets-scan/index.cjs +100 -100
  166. package/hooks/session-start/index.cjs +71 -71
  167. package/hooks/typecheck/index.cjs +65 -65
  168. package/package.json +63 -63
  169. package/references/ui-pro-max-data/LICENSE-UI-PRO-MAX +21 -21
  170. package/references/ui-pro-max-data/charts.csv +26 -26
  171. package/references/ui-pro-max-data/colors.csv +161 -161
  172. package/references/ui-pro-max-data/styles.csv +68 -68
  173. package/references/ui-pro-max-data/typography.csv +74 -74
  174. package/references/ui-pro-max-data/ui-reasoning.csv +162 -162
  175. package/references/ui-pro-max-data/ux-guidelines.csv +99 -99
  176. package/skills/adversary/SKILL.md +283 -283
  177. package/skills/asset-creator/SKILL.md +157 -157
  178. package/skills/audit/SKILL.md +147 -2
  179. package/skills/autopsy/SKILL.md +335 -335
  180. package/skills/ba/SKILL.md +85 -1
  181. package/skills/brainstorm/SKILL.md +380 -342
  182. package/skills/browser-pilot/SKILL.md +169 -168
  183. package/skills/constraint-check/SKILL.md +165 -165
  184. package/skills/context-engine/SKILL.md +408 -404
  185. package/skills/cook/SKILL.md +917 -863
  186. package/skills/db/SKILL.md +273 -273
  187. package/skills/debug/SKILL.md +465 -465
  188. package/skills/dependency-doctor/SKILL.md +265 -235
  189. package/skills/deploy/SKILL.md +274 -231
  190. package/skills/design/DESIGN-REFERENCE.md +365 -365
  191. package/skills/design/SKILL.md +590 -589
  192. package/skills/doc-processor/SKILL.md +254 -254
  193. package/skills/docs/SKILL.md +374 -374
  194. package/skills/docs-seeker/SKILL.md +178 -177
  195. package/skills/fix/SKILL.md +332 -330
  196. package/skills/git/SKILL.md +339 -339
  197. package/skills/hallucination-guard/SKILL.md +220 -219
  198. package/skills/incident/SKILL.md +254 -253
  199. package/skills/integrity-check/SKILL.md +169 -169
  200. package/skills/journal/SKILL.md +241 -240
  201. package/skills/launch/SKILL.md +344 -344
  202. package/skills/logic-guardian/SKILL.md +269 -251
  203. package/skills/marketing/SKILL.md +351 -289
  204. package/skills/mcp-builder/SKILL.md +425 -425
  205. package/skills/neural-memory/SKILL.md +359 -362
  206. package/skills/onboard/SKILL.md +432 -403
  207. package/skills/onboard/references/invariants-template.md +76 -0
  208. package/skills/onboard/scripts/detect-invariants.js +439 -0
  209. package/skills/onboard/scripts/inject-claude-md.js +150 -0
  210. package/skills/onboard/scripts/onboard-invariants.js +194 -0
  211. package/skills/perf/SKILL.md +347 -346
  212. package/skills/plan/SKILL.md +435 -428
  213. package/skills/preflight/SKILL.md +415 -415
  214. package/skills/problem-solver/SKILL.md +380 -284
  215. package/skills/rescue/SKILL.md +474 -474
  216. package/skills/research/SKILL.md +4 -0
  217. package/skills/retro/SKILL.md +3 -1
  218. package/skills/review/SKILL.md +614 -588
  219. package/skills/review-intake/SKILL.md +249 -249
  220. package/skills/safeguard/SKILL.md +200 -200
  221. package/skills/sast/SKILL.md +190 -190
  222. package/skills/scaffold/SKILL.md +328 -287
  223. package/skills/scope-guard/SKILL.md +183 -180
  224. package/skills/scout/SKILL.md +269 -263
  225. package/skills/sentinel/SKILL.md +384 -381
  226. package/skills/sentinel-env/SKILL.md +254 -254
  227. package/skills/sequential-thinking/SKILL.md +234 -234
  228. package/skills/session-bridge/SKILL.md +595 -543
  229. package/skills/session-bridge/scripts/load-invariants.js +397 -0
  230. package/skills/skill-forge/SKILL.md +581 -581
  231. package/skills/skill-router/SKILL.md +3 -0
  232. package/skills/slides/SKILL.md +19 -0
  233. package/skills/surgeon/SKILL.md +215 -215
  234. package/skills/team/SKILL.md +557 -537
  235. package/skills/test/SKILL.md +620 -614
  236. package/skills/trend-scout/SKILL.md +145 -145
  237. package/skills/verification/SKILL.md +334 -326
  238. package/skills/video-creator/SKILL.md +201 -201
  239. package/skills/watchdog/SKILL.md +168 -168
  240. package/skills/worktree/SKILL.md +140 -140
@@ -1,125 +1,125 @@
1
- ---
2
- name: "type-system"
3
- pack: "@rune/ui"
4
- description: "Typography pairing database — 22 font pairings organized by product vibe. Each pairing includes Google Fonts URL, Tailwind config, size scale from display to caption, weight mapping, and line height ratios."
5
- model: sonnet
6
- tools: [Read, Edit, Write, Grep, Glob, Bash]
7
- ---
8
-
9
- # type-system
10
-
11
- Typography pairing database — 22 font pairings organized by product vibe. Each pairing includes Google Fonts URL, Tailwind config, size scale from display to caption, weight mapping, and line height ratios. Decision tree maps product type and tone to the right pairing.
12
-
13
- #### Workflow
14
-
15
- **Step 1 — Detect product tone**
16
- Read `CLAUDE.md` or ask: "What is the product tone?" Classify: modern-tech | editorial | playful | corporate | developer | luxury | humanist | brutalist | minimal.
17
-
18
- **Step 2 — Recommend pairing**
19
- Apply the decision tree. Output the top 2 pairings with rationale (brand signal, readability score, Google Fonts load weight).
20
-
21
- **Step 3 — Generate @font-face / config**
22
- Emit the `<link>` preconnect + stylesheet tag for Google Fonts. Emit Tailwind `fontFamily` config. Emit a CSS type scale (`--text-display` through `--text-caption`).
23
-
24
- **Step 4 — Verify readability**
25
- Check: body size ≥ 14px, line-height ≥ 1.5 for body, ≤ 1.25 for headings. Flag any contrast failure using the project's background token.
26
-
27
- #### Decision Tree
28
-
29
- ```
30
- Product Tone → Pairing
31
- ──────────────────────────────────────────────────────────
32
- modern tech / saas → Space Grotesk + Inter
33
- editorial / blog → Playfair Display + Source Serif 4
34
- playful / kids / app → Fredoka + Nunito
35
- corporate / enterprise→ IBM Plex Sans + IBM Plex Serif
36
- developer tools / CLI → JetBrains Mono + Inter
37
- luxury / fashion → Cormorant Garamond + Montserrat
38
- humanist / health → DM Sans + DM Serif Display
39
- brutalist / bold → Bebas Neue + IBM Plex Mono
40
- minimal / productivity→ Inter + Inter (weight-only hierarchy)
41
- gaming / esports → Rajdhani + Exo 2
42
- ```
43
-
44
- #### Pairing Reference
45
-
46
- ```html
47
- <!-- Space Grotesk + Inter (modern-tech / saas) -->
48
- <link rel="preconnect" href="https://fonts.googleapis.com">
49
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
50
- <link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
51
-
52
- <!-- Playfair Display + Source Serif 4 (editorial) -->
53
- <link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,700;1,400&family=Source+Serif+4:wght@400;600&display=swap" rel="stylesheet">
54
-
55
- <!-- Fredoka + Nunito (playful) -->
56
- <link href="https://fonts.googleapis.com/css2?family=Fredoka:wght@400;600;700&family=Nunito:wght@400;600&display=swap" rel="stylesheet">
57
-
58
- <!-- IBM Plex Sans + IBM Plex Serif (corporate) -->
59
- <link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;600&family=IBM+Plex+Serif:wght@400;600&display=swap" rel="stylesheet">
60
-
61
- <!-- JetBrains Mono + Inter (developer tools) -->
62
- <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;700&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
63
-
64
- <!-- Cormorant Garamond + Montserrat (luxury) -->
65
- <link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,600;1,400&family=Montserrat:wght@400;500;700&display=swap" rel="stylesheet">
66
-
67
- <!-- DM Sans + DM Serif Display (humanist / health) -->
68
- <link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600&family=DM+Serif+Display&display=swap" rel="stylesheet">
69
- ```
70
-
71
- ```css
72
- /* Type scale — Space Grotesk + Inter pairing */
73
- :root {
74
- --font-display: 'Space Grotesk', system-ui, sans-serif;
75
- --font-body: 'Inter', system-ui, sans-serif;
76
- --font-mono: 'JetBrains Mono', monospace;
77
-
78
- /* Scale */
79
- --text-display: clamp(2.5rem, 5vw, 4.5rem); /* 40–72px */
80
- --text-h1: clamp(2rem, 4vw, 2.5rem); /* 32–40px */
81
- --text-h2: clamp(1.375rem, 2.5vw, 1.75rem); /* 22–28px */
82
- --text-h3: 1.125rem; /* 18px */
83
- --text-body: 1rem; /* 16px */
84
- --text-small: 0.875rem; /* 14px */
85
- --text-caption: 0.75rem; /* 12px */
86
-
87
- /* Leading */
88
- --leading-tight: 1.2;
89
- --leading-snug: 1.35;
90
- --leading-normal: 1.5;
91
- --leading-relaxed:1.75;
92
- }
93
-
94
- h1, h2, h3 { font-family: var(--font-display); line-height: var(--leading-tight); }
95
- body { font-family: var(--font-body); line-height: var(--leading-normal); }
96
- code, pre { font-family: var(--font-mono); }
97
-
98
- /* Financial numbers — always mono + bold */
99
- .number, .price, .stat {
100
- font-family: var(--font-mono);
101
- font-weight: 700;
102
- font-variant-numeric: tabular-nums;
103
- }
104
- ```
105
-
106
- ```js
107
- // tailwind.config.js — font pairing extension
108
- module.exports = {
109
- theme: {
110
- extend: {
111
- fontFamily: {
112
- display: ['Space Grotesk', 'system-ui', 'sans-serif'],
113
- body: ['Inter', 'system-ui', 'sans-serif'],
114
- mono: ['JetBrains Mono','monospace'],
115
- },
116
- fontSize: {
117
- 'display': ['clamp(2.5rem, 5vw, 4.5rem)', { lineHeight: '1.1' }],
118
- 'h1': ['clamp(2rem, 4vw, 2.5rem)', { lineHeight: '1.2' }],
119
- 'h2': ['1.75rem', { lineHeight: '1.3' }],
120
- 'h3': ['1.125rem', { lineHeight: '1.4' }],
121
- }
122
- }
123
- }
124
- }
125
- ```
1
+ ---
2
+ name: "type-system"
3
+ pack: "@rune/ui"
4
+ description: "Typography pairing database — 22 font pairings organized by product vibe. Each pairing includes Google Fonts URL, Tailwind config, size scale from display to caption, weight mapping, and line height ratios."
5
+ model: sonnet
6
+ tools: [Read, Edit, Write, Grep, Glob, Bash]
7
+ ---
8
+
9
+ # type-system
10
+
11
+ Typography pairing database — 22 font pairings organized by product vibe. Each pairing includes Google Fonts URL, Tailwind config, size scale from display to caption, weight mapping, and line height ratios. Decision tree maps product type and tone to the right pairing.
12
+
13
+ #### Workflow
14
+
15
+ **Step 1 — Detect product tone**
16
+ Read `CLAUDE.md` or ask: "What is the product tone?" Classify: modern-tech | editorial | playful | corporate | developer | luxury | humanist | brutalist | minimal.
17
+
18
+ **Step 2 — Recommend pairing**
19
+ Apply the decision tree. Output the top 2 pairings with rationale (brand signal, readability score, Google Fonts load weight).
20
+
21
+ **Step 3 — Generate @font-face / config**
22
+ Emit the `<link>` preconnect + stylesheet tag for Google Fonts. Emit Tailwind `fontFamily` config. Emit a CSS type scale (`--text-display` through `--text-caption`).
23
+
24
+ **Step 4 — Verify readability**
25
+ Check: body size ≥ 14px, line-height ≥ 1.5 for body, ≤ 1.25 for headings. Flag any contrast failure using the project's background token.
26
+
27
+ #### Decision Tree
28
+
29
+ ```
30
+ Product Tone → Pairing
31
+ ──────────────────────────────────────────────────────────
32
+ modern tech / saas → Space Grotesk + Inter
33
+ editorial / blog → Playfair Display + Source Serif 4
34
+ playful / kids / app → Fredoka + Nunito
35
+ corporate / enterprise→ IBM Plex Sans + IBM Plex Serif
36
+ developer tools / CLI → JetBrains Mono + Inter
37
+ luxury / fashion → Cormorant Garamond + Montserrat
38
+ humanist / health → DM Sans + DM Serif Display
39
+ brutalist / bold → Bebas Neue + IBM Plex Mono
40
+ minimal / productivity→ Inter + Inter (weight-only hierarchy)
41
+ gaming / esports → Rajdhani + Exo 2
42
+ ```
43
+
44
+ #### Pairing Reference
45
+
46
+ ```html
47
+ <!-- Space Grotesk + Inter (modern-tech / saas) -->
48
+ <link rel="preconnect" href="https://fonts.googleapis.com">
49
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
50
+ <link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
51
+
52
+ <!-- Playfair Display + Source Serif 4 (editorial) -->
53
+ <link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,700;1,400&family=Source+Serif+4:wght@400;600&display=swap" rel="stylesheet">
54
+
55
+ <!-- Fredoka + Nunito (playful) -->
56
+ <link href="https://fonts.googleapis.com/css2?family=Fredoka:wght@400;600;700&family=Nunito:wght@400;600&display=swap" rel="stylesheet">
57
+
58
+ <!-- IBM Plex Sans + IBM Plex Serif (corporate) -->
59
+ <link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;600&family=IBM+Plex+Serif:wght@400;600&display=swap" rel="stylesheet">
60
+
61
+ <!-- JetBrains Mono + Inter (developer tools) -->
62
+ <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;700&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
63
+
64
+ <!-- Cormorant Garamond + Montserrat (luxury) -->
65
+ <link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,600;1,400&family=Montserrat:wght@400;500;700&display=swap" rel="stylesheet">
66
+
67
+ <!-- DM Sans + DM Serif Display (humanist / health) -->
68
+ <link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600&family=DM+Serif+Display&display=swap" rel="stylesheet">
69
+ ```
70
+
71
+ ```css
72
+ /* Type scale — Space Grotesk + Inter pairing */
73
+ :root {
74
+ --font-display: 'Space Grotesk', system-ui, sans-serif;
75
+ --font-body: 'Inter', system-ui, sans-serif;
76
+ --font-mono: 'JetBrains Mono', monospace;
77
+
78
+ /* Scale */
79
+ --text-display: clamp(2.5rem, 5vw, 4.5rem); /* 40–72px */
80
+ --text-h1: clamp(2rem, 4vw, 2.5rem); /* 32–40px */
81
+ --text-h2: clamp(1.375rem, 2.5vw, 1.75rem); /* 22–28px */
82
+ --text-h3: 1.125rem; /* 18px */
83
+ --text-body: 1rem; /* 16px */
84
+ --text-small: 0.875rem; /* 14px */
85
+ --text-caption: 0.75rem; /* 12px */
86
+
87
+ /* Leading */
88
+ --leading-tight: 1.2;
89
+ --leading-snug: 1.35;
90
+ --leading-normal: 1.5;
91
+ --leading-relaxed:1.75;
92
+ }
93
+
94
+ h1, h2, h3 { font-family: var(--font-display); line-height: var(--leading-tight); }
95
+ body { font-family: var(--font-body); line-height: var(--leading-normal); }
96
+ code, pre { font-family: var(--font-mono); }
97
+
98
+ /* Financial numbers — always mono + bold */
99
+ .number, .price, .stat {
100
+ font-family: var(--font-mono);
101
+ font-weight: 700;
102
+ font-variant-numeric: tabular-nums;
103
+ }
104
+ ```
105
+
106
+ ```js
107
+ // tailwind.config.js — font pairing extension
108
+ module.exports = {
109
+ theme: {
110
+ extend: {
111
+ fontFamily: {
112
+ display: ['Space Grotesk', 'system-ui', 'sans-serif'],
113
+ body: ['Inter', 'system-ui', 'sans-serif'],
114
+ mono: ['JetBrains Mono','monospace'],
115
+ },
116
+ fontSize: {
117
+ 'display': ['clamp(2.5rem, 5vw, 4.5rem)', { lineHeight: '1.1' }],
118
+ 'h1': ['clamp(2rem, 4vw, 2.5rem)', { lineHeight: '1.2' }],
119
+ 'h2': ['1.75rem', { lineHeight: '1.3' }],
120
+ 'h3': ['1.125rem', { lineHeight: '1.4' }],
121
+ }
122
+ }
123
+ }
124
+ }
125
+ ```
@@ -1,153 +1,153 @@
1
- ---
2
- name: "web-vitals"
3
- pack: "@rune/ui"
4
- description: "Core Web Vitals performance audit — measures LCP, CLS, FCP, TBT, INP, and Speed Index against Google thresholds. Identifies render-blocking resources, network dependency chains, layout shift culprits, missing preloads, caching gaps, and tree-shaking opportunities."
5
- model: sonnet
6
- tools: [Read, Edit, Write, Grep, Glob, Bash]
7
- ---
8
-
9
- # web-vitals
10
-
11
- Core Web Vitals performance audit — measures LCP, CLS, FCP, TBT, INP, and Speed Index against Google thresholds. Identifies render-blocking resources, network dependency chains, layout shift culprits, missing preloads, caching gaps, and tree-shaking opportunities. Framework-aware analysis for Next.js, Vite, SvelteKit, and Astro.
12
-
13
- #### Workflow
14
-
15
- **Step 1 — Detect build tooling and framework**
16
- Read `package.json`, config files (`next.config.*`, `vite.config.*`, `svelte.config.*`, `astro.config.*`), and build scripts. Identify:
17
- - Bundler: Webpack, Vite, Rollup, esbuild, Turbopack
18
- - Framework: Next.js (App Router vs Pages), SvelteKit, Astro, Remix
19
- - CSS strategy: Tailwind (content config), CSS Modules, global CSS
20
- - Compression: gzip/brotli configuration
21
- - Source maps: enabled in production? (should be external or disabled)
22
-
23
- **Step 2 — Audit render-blocking resources**
24
- Use Grep to scan HTML entry points and framework layouts for:
25
- - `<link rel="stylesheet">` in `<head>` without `media` attribute — blocks first paint
26
- - `<script>` tags without `async` or `defer` — blocks HTML parsing
27
- - CSS `@import` chains — each import is a sequential network request
28
- - Large inline `<style>` blocks (>50KB) — delays first paint
29
-
30
- For each blocking resource, estimate impact: 0ms impact = note but don't prioritize. Focus on resources that delay FCP by >100ms.
31
-
32
- **Step 3 — Analyze layout shift sources (CLS)**
33
- Use Grep to find common CLS culprits:
34
- - `<img>` and `<video>` without explicit `width` and `height` attributes — causes layout shift when media loads
35
- - Dynamic content injection above the fold (`insertBefore`, `prepend`, or React `useState` toggling visibility)
36
- - Web fonts without `font-display: swap` or `font-display: optional` — FOIT causes text layout shift
37
- - Ads or embeds without reserved space (`aspect-ratio` or `min-height` on container)
38
- - CSS animations that trigger layout (`top`, `left`, `width`, `height`) instead of composited properties (`transform`, `opacity`)
39
-
40
- #### CLS Fix Patterns
41
-
42
- ```html
43
- <!-- BEFORE: no dimensions → layout shift when image loads -->
44
- <img src="/hero.jpg" alt="Hero" />
45
-
46
- <!-- AFTER: explicit dimensions prevent CLS -->
47
- <img src="/hero.jpg" alt="Hero" width="1200" height="630"
48
- class="w-full h-auto" loading="lazy" decoding="async" />
49
- ```
50
-
51
- ```css
52
- /* Font display — prevent FOIT layout shift */
53
- @font-face {
54
- font-family: 'Space Grotesk';
55
- src: url('/fonts/space-grotesk.woff2') format('woff2');
56
- font-display: swap; /* show fallback immediately, swap when loaded */
57
- }
58
-
59
- /* Reserve space for dynamic content */
60
- .ad-container {
61
- min-height: 250px; /* match ad unit height */
62
- contain: layout; /* prevent layout influence on siblings */
63
- }
64
- ```
65
-
66
- **Step 4 — Network dependency chain analysis**
67
- Identify critical rendering path bottlenecks:
68
- - **Waterfall chains**: Resource A loads → discovers Resource B → discovers Resource C. Each link adds latency. Fix with `<link rel="preload">` for critical assets.
69
- - **Missing preconnects**: Third-party origins (fonts.googleapis.com, CDN, analytics) without `<link rel="preconnect">`. But verify the origin is actually used — unused preconnects waste connection resources.
70
- - **Large payloads without compression**: JS/CSS bundles >100KB served without gzip/brotli. Check server response headers for `Content-Encoding`.
71
- - **Duplicate requests**: Same resource fetched multiple times (common with CSS @import or uncoordinated dynamic imports).
72
-
73
- ```html
74
- <!-- Preload critical resources discovered late in the waterfall -->
75
- <link rel="preload" href="/fonts/inter-var.woff2" as="font"
76
- type="font/woff2" crossorigin />
77
- <link rel="preload" href="/hero-image.webp" as="image"
78
- fetchpriority="high" />
79
-
80
- <!-- Preconnect to third-party origins ACTUALLY used -->
81
- <link rel="preconnect" href="https://fonts.googleapis.com" />
82
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
83
- ```
84
-
85
- **Step 5 — Tree-shaking and code splitting audit**
86
- Check bundler configuration and import patterns:
87
-
88
- | Issue | Detection | Fix |
89
- |---|---|---|
90
- | Barrel file re-exports break tree-shaking | `index.ts` with `export * from` or `export { A, B, C, ... }` importing everything | Import directly from source: `import { Button } from './Button'` not `from '.'` |
91
- | `sideEffects: false` missing in package.json | Check `package.json` `sideEffects` field | Add `"sideEffects": false` (or list files with side effects like CSS imports) |
92
- | No code splitting at route level | Framework routes without `React.lazy()` or `dynamic()` | Next.js does this automatically; Vite needs manual `React.lazy()` |
93
- | Vendor chunk too large (>250KB) | Check build output for single large chunk | Configure `splitChunks` (Webpack) or `manualChunks` (Vite/Rollup) |
94
- | CSS not purged | Tailwind without `content` config, or unused CSS classes shipping | Verify `tailwind.config.js` `content` paths cover all template files |
95
-
96
- **Step 6 — Image optimization audit**
97
- Scan for image-related performance issues:
98
- - Serving JPEG/PNG when WebP/AVIF would save 30-60% bandwidth — check `<img>` `src` extensions
99
- - Missing `loading="lazy"` on below-the-fold images
100
- - Missing `fetchpriority="high"` on LCP image (hero image, above-the-fold banner)
101
- - Images served at full resolution without responsive `srcset` — wastes bandwidth on mobile
102
- - No `<picture>` element for art direction (different crops for mobile/desktop)
103
-
104
- ```html
105
- <!-- Optimized responsive image with modern formats -->
106
- <picture>
107
- <source srcset="/hero.avif" type="image/avif" />
108
- <source srcset="/hero.webp" type="image/webp" />
109
- <img
110
- src="/hero.jpg"
111
- alt="Product dashboard showing real-time analytics"
112
- width="1200" height="630"
113
- class="w-full h-auto"
114
- fetchpriority="high"
115
- decoding="async"
116
- />
117
- </picture>
118
-
119
- <!-- Below-the-fold: lazy load -->
120
- <img src="/feature.webp" alt="..." loading="lazy" decoding="async"
121
- width="600" height="400" class="w-full h-auto" />
122
- ```
123
-
124
- **Step 7 — Generate performance report**
125
- Produce a structured report with Core Web Vitals thresholds:
126
-
127
- ```
128
- Web Vitals Audit — [Project Name]
129
- ═══════════════════════════════════════
130
- Thresholds (Good / Needs Improvement / Poor):
131
- LCP: < 2.5s / < 4.0s / > 4.0s
132
- FCP: < 1.8s / < 3.0s / > 3.0s
133
- CLS: < 0.1 / < 0.25 / > 0.25
134
- INP: < 200ms / < 500ms / > 500ms
135
- TBT: < 200ms / < 600ms / > 600ms
136
- TTFB: < 800ms / < 1.8s / > 1.8s
137
-
138
- Top Issues (by estimated impact):
139
- 1. [HIGH] Hero image served as 2.4MB PNG — convert to WebP, save ~1.5MB
140
- 2. [HIGH] 3 render-blocking stylesheets in <head> — defer non-critical CSS
141
- 3. [MEDIUM] 4 images missing width/height — causes CLS on load
142
- 4. [MEDIUM] lodash imported wholesale — tree-shake or replace with lodash-es
143
- 5. [LOW] Font preconnect to unused origin — remove to free connection slot
144
- ```
145
-
146
- #### Sharp Edges
147
-
148
- | Failure Mode | Mitigation |
149
- |---|---|
150
- | Recommending image lazy-load on LCP element | Never lazy-load the LCP image — it must load eagerly with `fetchpriority="high"` |
151
- | Flagging render-blocking CSS that's actually critical | Distinguish critical (above-fold) CSS from non-critical before recommending defer |
152
- | Tree-shaking audit false positives on CSS-in-JS | CSS `import './styles.css'` is a side effect — don't flag as unused |
153
- | Preconnect removal breaks actual resource loading | Always verify zero requests went to the origin before recommending removal |
1
+ ---
2
+ name: "web-vitals"
3
+ pack: "@rune/ui"
4
+ description: "Core Web Vitals performance audit — measures LCP, CLS, FCP, TBT, INP, and Speed Index against Google thresholds. Identifies render-blocking resources, network dependency chains, layout shift culprits, missing preloads, caching gaps, and tree-shaking opportunities."
5
+ model: sonnet
6
+ tools: [Read, Edit, Write, Grep, Glob, Bash]
7
+ ---
8
+
9
+ # web-vitals
10
+
11
+ Core Web Vitals performance audit — measures LCP, CLS, FCP, TBT, INP, and Speed Index against Google thresholds. Identifies render-blocking resources, network dependency chains, layout shift culprits, missing preloads, caching gaps, and tree-shaking opportunities. Framework-aware analysis for Next.js, Vite, SvelteKit, and Astro.
12
+
13
+ #### Workflow
14
+
15
+ **Step 1 — Detect build tooling and framework**
16
+ Read `package.json`, config files (`next.config.*`, `vite.config.*`, `svelte.config.*`, `astro.config.*`), and build scripts. Identify:
17
+ - Bundler: Webpack, Vite, Rollup, esbuild, Turbopack
18
+ - Framework: Next.js (App Router vs Pages), SvelteKit, Astro, Remix
19
+ - CSS strategy: Tailwind (content config), CSS Modules, global CSS
20
+ - Compression: gzip/brotli configuration
21
+ - Source maps: enabled in production? (should be external or disabled)
22
+
23
+ **Step 2 — Audit render-blocking resources**
24
+ Use Grep to scan HTML entry points and framework layouts for:
25
+ - `<link rel="stylesheet">` in `<head>` without `media` attribute — blocks first paint
26
+ - `<script>` tags without `async` or `defer` — blocks HTML parsing
27
+ - CSS `@import` chains — each import is a sequential network request
28
+ - Large inline `<style>` blocks (>50KB) — delays first paint
29
+
30
+ For each blocking resource, estimate impact: 0ms impact = note but don't prioritize. Focus on resources that delay FCP by >100ms.
31
+
32
+ **Step 3 — Analyze layout shift sources (CLS)**
33
+ Use Grep to find common CLS culprits:
34
+ - `<img>` and `<video>` without explicit `width` and `height` attributes — causes layout shift when media loads
35
+ - Dynamic content injection above the fold (`insertBefore`, `prepend`, or React `useState` toggling visibility)
36
+ - Web fonts without `font-display: swap` or `font-display: optional` — FOIT causes text layout shift
37
+ - Ads or embeds without reserved space (`aspect-ratio` or `min-height` on container)
38
+ - CSS animations that trigger layout (`top`, `left`, `width`, `height`) instead of composited properties (`transform`, `opacity`)
39
+
40
+ #### CLS Fix Patterns
41
+
42
+ ```html
43
+ <!-- BEFORE: no dimensions → layout shift when image loads -->
44
+ <img src="/hero.jpg" alt="Hero" />
45
+
46
+ <!-- AFTER: explicit dimensions prevent CLS -->
47
+ <img src="/hero.jpg" alt="Hero" width="1200" height="630"
48
+ class="w-full h-auto" loading="lazy" decoding="async" />
49
+ ```
50
+
51
+ ```css
52
+ /* Font display — prevent FOIT layout shift */
53
+ @font-face {
54
+ font-family: 'Space Grotesk';
55
+ src: url('/fonts/space-grotesk.woff2') format('woff2');
56
+ font-display: swap; /* show fallback immediately, swap when loaded */
57
+ }
58
+
59
+ /* Reserve space for dynamic content */
60
+ .ad-container {
61
+ min-height: 250px; /* match ad unit height */
62
+ contain: layout; /* prevent layout influence on siblings */
63
+ }
64
+ ```
65
+
66
+ **Step 4 — Network dependency chain analysis**
67
+ Identify critical rendering path bottlenecks:
68
+ - **Waterfall chains**: Resource A loads → discovers Resource B → discovers Resource C. Each link adds latency. Fix with `<link rel="preload">` for critical assets.
69
+ - **Missing preconnects**: Third-party origins (fonts.googleapis.com, CDN, analytics) without `<link rel="preconnect">`. But verify the origin is actually used — unused preconnects waste connection resources.
70
+ - **Large payloads without compression**: JS/CSS bundles >100KB served without gzip/brotli. Check server response headers for `Content-Encoding`.
71
+ - **Duplicate requests**: Same resource fetched multiple times (common with CSS @import or uncoordinated dynamic imports).
72
+
73
+ ```html
74
+ <!-- Preload critical resources discovered late in the waterfall -->
75
+ <link rel="preload" href="/fonts/inter-var.woff2" as="font"
76
+ type="font/woff2" crossorigin />
77
+ <link rel="preload" href="/hero-image.webp" as="image"
78
+ fetchpriority="high" />
79
+
80
+ <!-- Preconnect to third-party origins ACTUALLY used -->
81
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
82
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
83
+ ```
84
+
85
+ **Step 5 — Tree-shaking and code splitting audit**
86
+ Check bundler configuration and import patterns:
87
+
88
+ | Issue | Detection | Fix |
89
+ |---|---|---|
90
+ | Barrel file re-exports break tree-shaking | `index.ts` with `export * from` or `export { A, B, C, ... }` importing everything | Import directly from source: `import { Button } from './Button'` not `from '.'` |
91
+ | `sideEffects: false` missing in package.json | Check `package.json` `sideEffects` field | Add `"sideEffects": false` (or list files with side effects like CSS imports) |
92
+ | No code splitting at route level | Framework routes without `React.lazy()` or `dynamic()` | Next.js does this automatically; Vite needs manual `React.lazy()` |
93
+ | Vendor chunk too large (>250KB) | Check build output for single large chunk | Configure `splitChunks` (Webpack) or `manualChunks` (Vite/Rollup) |
94
+ | CSS not purged | Tailwind without `content` config, or unused CSS classes shipping | Verify `tailwind.config.js` `content` paths cover all template files |
95
+
96
+ **Step 6 — Image optimization audit**
97
+ Scan for image-related performance issues:
98
+ - Serving JPEG/PNG when WebP/AVIF would save 30-60% bandwidth — check `<img>` `src` extensions
99
+ - Missing `loading="lazy"` on below-the-fold images
100
+ - Missing `fetchpriority="high"` on LCP image (hero image, above-the-fold banner)
101
+ - Images served at full resolution without responsive `srcset` — wastes bandwidth on mobile
102
+ - No `<picture>` element for art direction (different crops for mobile/desktop)
103
+
104
+ ```html
105
+ <!-- Optimized responsive image with modern formats -->
106
+ <picture>
107
+ <source srcset="/hero.avif" type="image/avif" />
108
+ <source srcset="/hero.webp" type="image/webp" />
109
+ <img
110
+ src="/hero.jpg"
111
+ alt="Product dashboard showing real-time analytics"
112
+ width="1200" height="630"
113
+ class="w-full h-auto"
114
+ fetchpriority="high"
115
+ decoding="async"
116
+ />
117
+ </picture>
118
+
119
+ <!-- Below-the-fold: lazy load -->
120
+ <img src="/feature.webp" alt="..." loading="lazy" decoding="async"
121
+ width="600" height="400" class="w-full h-auto" />
122
+ ```
123
+
124
+ **Step 7 — Generate performance report**
125
+ Produce a structured report with Core Web Vitals thresholds:
126
+
127
+ ```
128
+ Web Vitals Audit — [Project Name]
129
+ ═══════════════════════════════════════
130
+ Thresholds (Good / Needs Improvement / Poor):
131
+ LCP: < 2.5s / < 4.0s / > 4.0s
132
+ FCP: < 1.8s / < 3.0s / > 3.0s
133
+ CLS: < 0.1 / < 0.25 / > 0.25
134
+ INP: < 200ms / < 500ms / > 500ms
135
+ TBT: < 200ms / < 600ms / > 600ms
136
+ TTFB: < 800ms / < 1.8s / > 1.8s
137
+
138
+ Top Issues (by estimated impact):
139
+ 1. [HIGH] Hero image served as 2.4MB PNG — convert to WebP, save ~1.5MB
140
+ 2. [HIGH] 3 render-blocking stylesheets in <head> — defer non-critical CSS
141
+ 3. [MEDIUM] 4 images missing width/height — causes CLS on load
142
+ 4. [MEDIUM] lodash imported wholesale — tree-shake or replace with lodash-es
143
+ 5. [LOW] Font preconnect to unused origin — remove to free connection slot
144
+ ```
145
+
146
+ #### Sharp Edges
147
+
148
+ | Failure Mode | Mitigation |
149
+ |---|---|
150
+ | Recommending image lazy-load on LCP element | Never lazy-load the LCP image — it must load eagerly with `fetchpriority="high"` |
151
+ | Flagging render-blocking CSS that's actually critical | Distinguish critical (above-fold) CSS from non-critical before recommending defer |
152
+ | Tree-shaking audit false positives on CSS-in-JS | CSS `import './styles.css'` is a side effect — don't flag as unused |
153
+ | Preconnect removal breaks actual resource loading | Always verify zero requests went to the origin before recommending removal |