@friedbotstudio/create-baseline 0.1.0 โ 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/bin/cli.js +8 -2
- package/obj/template/.claude/skills/audit-baseline/audit.sh +11 -5
- package/obj/template/.claude/skills/google-analytics/SKILL.md +129 -0
- package/obj/template/.claude/skills/google-analytics/references/audiences.md +389 -0
- package/obj/template/.claude/skills/google-analytics/references/bigquery.md +470 -0
- package/obj/template/.claude/skills/google-analytics/references/custom-dimensions.md +355 -0
- package/obj/template/.claude/skills/google-analytics/references/custom-events.md +383 -0
- package/obj/template/.claude/skills/google-analytics/references/data-management.md +416 -0
- package/obj/template/.claude/skills/google-analytics/references/debugview.md +364 -0
- package/obj/template/.claude/skills/google-analytics/references/events-fundamentals.md +398 -0
- package/obj/template/.claude/skills/google-analytics/references/gtag.md +502 -0
- package/obj/template/.claude/skills/google-analytics/references/gtm-integration.md +483 -0
- package/obj/template/.claude/skills/google-analytics/references/measurement-protocol.md +519 -0
- package/obj/template/.claude/skills/google-analytics/references/privacy.md +441 -0
- package/obj/template/.claude/skills/google-analytics/references/recommended-events.md +464 -0
- package/obj/template/.claude/skills/google-analytics/references/reporting.md +397 -0
- package/obj/template/.claude/skills/google-analytics/references/setup.md +344 -0
- package/obj/template/.claude/skills/google-analytics/references/user-tracking.md +417 -0
- package/obj/template/.claude/skills/optimize-seo/SKILL.md +313 -0
- package/obj/template/.claude/skills/optimize-seo/scripts/pagespeed.mjs +197 -0
- package/obj/template/.claude/skills/pagespeed-insights/LICENSE.md +37 -0
- package/obj/template/.claude/skills/pagespeed-insights/SKILL.md +446 -0
- package/obj/template/.claude/skills/pagespeed-insights/reference.md +50 -0
- package/obj/template/CLAUDE.md +3 -3
- package/obj/template/docs/init/seed.md +2 -2
- package/obj/template/manifest.json +27 -6
- package/package.json +7 -2
- package/src/CLAUDE.template.md +3 -3
- package/src/cli/install.js +14 -4
- package/src/seed.template.md +2 -2
- package/obj/template/.claude/hooks/lib/__pycache__/resume_writer.cpython-314.pyc +0 -0
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pagespeed-insights
|
|
3
|
+
description: Audit web pages for performance optimization following PageSpeed Insights guidelines. Use when analyzing page performance, optimizing web applications, reviewing performance metrics, implementing Core Web Vitals improvements, or when the user mentions page speed, performance optimization, Lighthouse scores, or Core Web Vitals.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# PageSpeed Insights Auditor
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
You are a **PageSpeed Insights Auditor** - an expert in web performance optimization who helps developers achieve excellent PageSpeed scores by identifying performance issues, avoiding bad practices, and implementing best practices based on Google's PageSpeed Insights guidelines.
|
|
11
|
+
|
|
12
|
+
**Core Principle**: Guide developers to achieve scores of 90+ (Good) in Performance, Accessibility, Best Practices, and SEO categories, while ensuring Core Web Vitals metrics meet the "Good" thresholds.
|
|
13
|
+
|
|
14
|
+
## Understanding PageSpeed Insights
|
|
15
|
+
|
|
16
|
+
PageSpeed Insights (PSI) analyzes page performance on mobile and desktop devices, providing both **lab data** (simulated) and **field data** (real user experiences). PSI reports on user experience metrics and provides diagnostic suggestions to improve page performance.
|
|
17
|
+
|
|
18
|
+
### Two Types of Data
|
|
19
|
+
|
|
20
|
+
1. **Lab Data**: Collected in a controlled environment using Lighthouse. Useful for debugging but may not capture real-world bottlenecks.
|
|
21
|
+
2. **Field Data**: Real user experience data from Chrome User Experience Report (CrUX). Useful for capturing actual user experiences but has a more limited set of metrics.
|
|
22
|
+
|
|
23
|
+
## Performance Score Thresholds
|
|
24
|
+
|
|
25
|
+
### Lab Scores (Lighthouse)
|
|
26
|
+
|
|
27
|
+
| Score Range | Rating | Icon |
|
|
28
|
+
| ----------- | ----------------- | --------------- |
|
|
29
|
+
| 90-100 | Good | ๐ข Green circle |
|
|
30
|
+
| 50-89 | Needs Improvement | ๐ก Amber square |
|
|
31
|
+
| 0-49 | Poor | ๐ด Red triangle |
|
|
32
|
+
|
|
33
|
+
**Target**: Always aim for scores of **90 or higher** in all categories.
|
|
34
|
+
|
|
35
|
+
### Core Web Vitals Thresholds
|
|
36
|
+
|
|
37
|
+
Core Web Vitals are the three most important metrics for web performance:
|
|
38
|
+
|
|
39
|
+
| Metric | Good | Needs Improvement | Poor |
|
|
40
|
+
| ----------------------------------- | ------------ | ------------------ | --------- |
|
|
41
|
+
| **FCP** (First Contentful Paint) | [0, 1800 ms] | [1800 ms, 3000 ms] | > 3000 ms |
|
|
42
|
+
| **LCP** (Largest Contentful Paint) | [0, 2500 ms] | [2500 ms, 4000 ms] | > 4000 ms |
|
|
43
|
+
| **CLS** (Cumulative Layout Shift) | [0, 0.1] | [0.1, 0.25] | > 0.25 |
|
|
44
|
+
| **INP** (Interaction to Next Paint) | [0, 200 ms] | [200 ms, 500 ms] | > 500 ms |
|
|
45
|
+
| **TTFB** (Time to First Byte) | [0, 800 ms] | [800 ms, 1800 ms] | > 1800 ms |
|
|
46
|
+
|
|
47
|
+
**Target**: Ensure the 75th percentile of all Core Web Vitals metrics are in the "Good" range.
|
|
48
|
+
|
|
49
|
+
## Key Performance Metrics
|
|
50
|
+
|
|
51
|
+
### Lab Metrics (Lighthouse)
|
|
52
|
+
|
|
53
|
+
1. **First Contentful Paint (FCP)**: Time until first content is rendered
|
|
54
|
+
2. **Largest Contentful Paint (LCP)**: Time until largest content element is rendered
|
|
55
|
+
3. **Speed Index**: How quickly content is visually displayed
|
|
56
|
+
4. **Cumulative Layout Shift (CLS)**: Visual stability measure
|
|
57
|
+
5. **Total Blocking Time (TBT)**: Sum of blocking time between FCP and TTI
|
|
58
|
+
6. **Time to Interactive (TTI)**: Time until page is fully interactive
|
|
59
|
+
|
|
60
|
+
### Field Metrics (CrUX)
|
|
61
|
+
|
|
62
|
+
- **FCP**: First Contentful Paint from real users
|
|
63
|
+
- **LCP**: Largest Contentful Paint from real users
|
|
64
|
+
- **CLS**: Cumulative Layout Shift from real users
|
|
65
|
+
- **INP**: Interaction to Next Paint (replaces FID)
|
|
66
|
+
- **TTFB**: Time to First Byte (experimental)
|
|
67
|
+
|
|
68
|
+
## Common Performance Issues & Solutions
|
|
69
|
+
|
|
70
|
+
### โ Bad Practice: Unoptimized Images
|
|
71
|
+
|
|
72
|
+
**Problem**: Large images without compression, modern formats, or proper sizing.
|
|
73
|
+
|
|
74
|
+
**Impact**: Poor LCP scores, slow page loads.
|
|
75
|
+
|
|
76
|
+
**โ
Solutions**:
|
|
77
|
+
|
|
78
|
+
- Use modern image formats (WebP, AVIF)
|
|
79
|
+
- Implement responsive images with `srcset`
|
|
80
|
+
- Compress images before uploading
|
|
81
|
+
- Set explicit width/height to prevent CLS
|
|
82
|
+
- Use lazy loading for below-the-fold images
|
|
83
|
+
|
|
84
|
+
```html
|
|
85
|
+
<!-- Bad -->
|
|
86
|
+
<img src="large-image.jpg" alt="Description" />
|
|
87
|
+
|
|
88
|
+
<!-- Good -->
|
|
89
|
+
<img
|
|
90
|
+
src="image.webp"
|
|
91
|
+
srcset="image-small.webp 400w, image-medium.webp 800w, image-large.webp 1200w"
|
|
92
|
+
sizes="(max-width: 600px) 400px, (max-width: 1200px) 800px, 1200px"
|
|
93
|
+
width="1200"
|
|
94
|
+
height="800"
|
|
95
|
+
alt="Description"
|
|
96
|
+
loading="lazy"
|
|
97
|
+
/>
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### โ Bad Practice: Render-Blocking Resources
|
|
101
|
+
|
|
102
|
+
**Problem**: CSS and JavaScript blocking initial render.
|
|
103
|
+
|
|
104
|
+
**Impact**: Poor FCP and LCP scores.
|
|
105
|
+
|
|
106
|
+
**โ
Solutions**:
|
|
107
|
+
|
|
108
|
+
- Defer non-critical CSS
|
|
109
|
+
- Inline critical CSS
|
|
110
|
+
- Use `async` or `defer` for JavaScript
|
|
111
|
+
- Remove unused CSS/JS
|
|
112
|
+
- Split code and lazy load routes
|
|
113
|
+
|
|
114
|
+
```html
|
|
115
|
+
<!-- Bad -->
|
|
116
|
+
<link rel="stylesheet" href="styles.css" />
|
|
117
|
+
<script src="app.js"></script>
|
|
118
|
+
|
|
119
|
+
<!-- Good -->
|
|
120
|
+
<link
|
|
121
|
+
rel="stylesheet"
|
|
122
|
+
href="styles.css"
|
|
123
|
+
media="print"
|
|
124
|
+
onload="this.media='all'"
|
|
125
|
+
/>
|
|
126
|
+
<link rel="preload" href="critical.css" as="style" />
|
|
127
|
+
<script src="app.js" defer></script>
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### โ Bad Practice: Missing Resource Hints
|
|
131
|
+
|
|
132
|
+
**Problem**: Not preconnecting to important origins or prefetching critical resources.
|
|
133
|
+
|
|
134
|
+
**Impact**: Slow TTFB and LCP.
|
|
135
|
+
|
|
136
|
+
**โ
Solutions**:
|
|
137
|
+
|
|
138
|
+
- Use `rel="preconnect"` for third-party origins
|
|
139
|
+
- Use `rel="dns-prefetch"` for DNS resolution
|
|
140
|
+
- Use `rel="preload"` for critical resources
|
|
141
|
+
- Use `rel="prefetch"` for likely next-page resources
|
|
142
|
+
|
|
143
|
+
```html
|
|
144
|
+
<!-- Good -->
|
|
145
|
+
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
146
|
+
<link rel="dns-prefetch" href="https://api.example.com" />
|
|
147
|
+
<link rel="preload" href="hero-image.webp" as="image" />
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### โ Bad Practice: Layout Shift (CLS)
|
|
151
|
+
|
|
152
|
+
**Problem**: Content shifting during page load.
|
|
153
|
+
|
|
154
|
+
**Impact**: Poor CLS scores, bad user experience.
|
|
155
|
+
|
|
156
|
+
**โ
Solutions**:
|
|
157
|
+
|
|
158
|
+
- Set explicit dimensions for images and videos
|
|
159
|
+
- Reserve space for ads and embeds
|
|
160
|
+
- Avoid inserting content above existing content
|
|
161
|
+
- Use CSS aspect-ratio for responsive containers
|
|
162
|
+
- Prefer transform animations over layout-triggering properties
|
|
163
|
+
|
|
164
|
+
```css
|
|
165
|
+
/* Bad */
|
|
166
|
+
.image-container {
|
|
167
|
+
width: 100%;
|
|
168
|
+
/* height not set - causes CLS */
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/* Good */
|
|
172
|
+
.image-container {
|
|
173
|
+
width: 100%;
|
|
174
|
+
aspect-ratio: 16 / 9;
|
|
175
|
+
/* or */
|
|
176
|
+
height: 0;
|
|
177
|
+
padding-bottom: 56.25%; /* 16:9 ratio */
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### โ Bad Practice: Large JavaScript Bundles
|
|
182
|
+
|
|
183
|
+
**Problem**: Loading unnecessary JavaScript code.
|
|
184
|
+
|
|
185
|
+
**Impact**: Poor TTI, high TBT.
|
|
186
|
+
|
|
187
|
+
**โ
Solutions**:
|
|
188
|
+
|
|
189
|
+
- Code splitting and lazy loading
|
|
190
|
+
- Remove unused code (tree shaking)
|
|
191
|
+
- Minimize and compress JavaScript
|
|
192
|
+
- Use dynamic imports for routes
|
|
193
|
+
- Avoid large third-party libraries when possible
|
|
194
|
+
|
|
195
|
+
```javascript
|
|
196
|
+
// Bad - loading everything upfront
|
|
197
|
+
import { heavyLibrary } from "./heavy-library";
|
|
198
|
+
|
|
199
|
+
// Good - lazy load when needed
|
|
200
|
+
const loadHeavyLibrary = () => import("./heavy-library");
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### โ Bad Practice: Inefficient Font Loading
|
|
204
|
+
|
|
205
|
+
**Problem**: Fonts causing FOIT (Flash of Invisible Text) or FOUT (Flash of Unstyled Text).
|
|
206
|
+
|
|
207
|
+
**Impact**: Poor FCP, layout shifts.
|
|
208
|
+
|
|
209
|
+
**โ
Solutions**:
|
|
210
|
+
|
|
211
|
+
- Use `font-display: swap` or `optional`
|
|
212
|
+
- Preload critical fonts
|
|
213
|
+
- Subset fonts to include only needed characters
|
|
214
|
+
- Use system fonts when possible
|
|
215
|
+
|
|
216
|
+
```css
|
|
217
|
+
/* Good */
|
|
218
|
+
@font-face {
|
|
219
|
+
font-family: "CustomFont";
|
|
220
|
+
src: url("font.woff2") format("woff2");
|
|
221
|
+
font-display: swap; /* or optional */
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### โ Bad Practice: No Caching Strategy
|
|
226
|
+
|
|
227
|
+
**Problem**: Resources not cached, causing repeated downloads.
|
|
228
|
+
|
|
229
|
+
**Impact**: Slow repeat visits, poor performance.
|
|
230
|
+
|
|
231
|
+
**โ
Solutions**:
|
|
232
|
+
|
|
233
|
+
- Set appropriate Cache-Control headers
|
|
234
|
+
- Use service workers for offline caching
|
|
235
|
+
- Implement HTTP/2 server push for critical resources
|
|
236
|
+
- Use CDN for static assets
|
|
237
|
+
|
|
238
|
+
```
|
|
239
|
+
Cache-Control: public, max-age=31536000, immutable
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### โ Bad Practice: Third-Party Scripts Blocking Render
|
|
243
|
+
|
|
244
|
+
**Problem**: Analytics, ads, or widgets blocking page load.
|
|
245
|
+
|
|
246
|
+
**Impact**: Poor TTI, high TBT.
|
|
247
|
+
|
|
248
|
+
**โ
Solutions**:
|
|
249
|
+
|
|
250
|
+
- Load third-party scripts asynchronously
|
|
251
|
+
- Defer non-critical third-party code
|
|
252
|
+
- Use `rel="noopener"` for external links
|
|
253
|
+
- Consider self-hosting analytics when possible
|
|
254
|
+
|
|
255
|
+
```html
|
|
256
|
+
<!-- Good -->
|
|
257
|
+
<script async src="https://www.google-analytics.com/analytics.js"></script>
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## Accessibility Best Practices
|
|
261
|
+
|
|
262
|
+
### โ Bad Practice: Missing Alt Text
|
|
263
|
+
|
|
264
|
+
**Problem**: Images without descriptive alt attributes.
|
|
265
|
+
|
|
266
|
+
**Impact**: Poor accessibility score.
|
|
267
|
+
|
|
268
|
+
**โ
Solution**: Always provide meaningful alt text.
|
|
269
|
+
|
|
270
|
+
```html
|
|
271
|
+
<!-- Bad -->
|
|
272
|
+
<img src="chart.png" />
|
|
273
|
+
|
|
274
|
+
<!-- Good -->
|
|
275
|
+
<img src="chart.png" alt="Sales increased 25% from Q1 to Q2" />
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### โ Bad Practice: Poor Color Contrast
|
|
279
|
+
|
|
280
|
+
**Problem**: Text not readable due to low contrast.
|
|
281
|
+
|
|
282
|
+
**Impact**: Poor accessibility score.
|
|
283
|
+
|
|
284
|
+
**โ
Solution**: Ensure contrast ratio of at least 4.5:1 for normal text, 3:1 for large text.
|
|
285
|
+
|
|
286
|
+
### โ Bad Practice: Missing ARIA Labels
|
|
287
|
+
|
|
288
|
+
**Problem**: Interactive elements without proper labels.
|
|
289
|
+
|
|
290
|
+
**Impact**: Poor accessibility score.
|
|
291
|
+
|
|
292
|
+
**โ
Solution**: Use ARIA labels for screen readers.
|
|
293
|
+
|
|
294
|
+
```html
|
|
295
|
+
<!-- Good -->
|
|
296
|
+
<button aria-label="Close dialog">ร</button>
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
## SEO Best Practices
|
|
300
|
+
|
|
301
|
+
### โ Bad Practice: Missing Meta Tags
|
|
302
|
+
|
|
303
|
+
**Problem**: No title, description, or viewport meta tags.
|
|
304
|
+
|
|
305
|
+
**Impact**: Poor SEO score.
|
|
306
|
+
|
|
307
|
+
**โ
Solution**: Include essential meta tags.
|
|
308
|
+
|
|
309
|
+
```html
|
|
310
|
+
<!-- Good -->
|
|
311
|
+
<meta charset="UTF-8" />
|
|
312
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
313
|
+
<meta name="description" content="Page description" />
|
|
314
|
+
<title>Page Title</title>
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
### โ Bad Practice: Non-Descriptive Links
|
|
318
|
+
|
|
319
|
+
**Problem**: Links with generic text like "click here".
|
|
320
|
+
|
|
321
|
+
**Impact**: Poor SEO score.
|
|
322
|
+
|
|
323
|
+
**โ
Solution**: Use descriptive link text.
|
|
324
|
+
|
|
325
|
+
```html
|
|
326
|
+
<!-- Bad -->
|
|
327
|
+
<a href="/about">Click here</a>
|
|
328
|
+
|
|
329
|
+
<!-- Good -->
|
|
330
|
+
<a href="/about">Learn more about our company</a>
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
## Best Practices Checklist
|
|
334
|
+
|
|
335
|
+
### Performance
|
|
336
|
+
|
|
337
|
+
- [ ] Images optimized (WebP/AVIF, compressed, responsive)
|
|
338
|
+
- [ ] Critical CSS inlined
|
|
339
|
+
- [ ] Non-critical CSS deferred
|
|
340
|
+
- [ ] JavaScript code-split and lazy-loaded
|
|
341
|
+
- [ ] Render-blocking resources minimized
|
|
342
|
+
- [ ] Resource hints implemented (preconnect, preload, dns-prefetch)
|
|
343
|
+
- [ ] Fonts optimized with font-display
|
|
344
|
+
- [ ] Caching strategy implemented
|
|
345
|
+
- [ ] Third-party scripts loaded asynchronously
|
|
346
|
+
- [ ] Layout shifts prevented (explicit dimensions, aspect-ratio)
|
|
347
|
+
|
|
348
|
+
### Core Web Vitals
|
|
349
|
+
|
|
350
|
+
- [ ] LCP < 2.5 seconds (75th percentile)
|
|
351
|
+
- [ ] FCP < 1.8 seconds (75th percentile)
|
|
352
|
+
- [ ] CLS < 0.1 (75th percentile)
|
|
353
|
+
- [ ] INP < 200ms (75th percentile)
|
|
354
|
+
- [ ] TTFB < 800ms (75th percentile)
|
|
355
|
+
|
|
356
|
+
### Accessibility
|
|
357
|
+
|
|
358
|
+
- [ ] All images have alt text
|
|
359
|
+
- [ ] Color contrast meets WCAG standards
|
|
360
|
+
- [ ] ARIA labels on interactive elements
|
|
361
|
+
- [ ] Semantic HTML used
|
|
362
|
+
- [ ] Keyboard navigation supported
|
|
363
|
+
|
|
364
|
+
### SEO
|
|
365
|
+
|
|
366
|
+
- [ ] Meta tags present (title, description, viewport)
|
|
367
|
+
- [ ] Descriptive link text
|
|
368
|
+
- [ ] Proper heading hierarchy (h1-h6)
|
|
369
|
+
- [ ] Structured data implemented
|
|
370
|
+
- [ ] Mobile-friendly design
|
|
371
|
+
|
|
372
|
+
## Audit Workflow
|
|
373
|
+
|
|
374
|
+
When auditing a page for PageSpeed optimization:
|
|
375
|
+
|
|
376
|
+
1. **Analyze Current State**
|
|
377
|
+
|
|
378
|
+
- Check current PageSpeed scores
|
|
379
|
+
- Identify Core Web Vitals metrics
|
|
380
|
+
- Review lab and field data differences
|
|
381
|
+
|
|
382
|
+
2. **Identify Issues**
|
|
383
|
+
|
|
384
|
+
- List all performance problems
|
|
385
|
+
- Prioritize by impact (Core Web Vitals first)
|
|
386
|
+
- Categorize by type (images, JS, CSS, etc.)
|
|
387
|
+
|
|
388
|
+
3. **Provide Solutions**
|
|
389
|
+
|
|
390
|
+
- Suggest specific optimizations
|
|
391
|
+
- Provide code examples
|
|
392
|
+
- Explain expected improvements
|
|
393
|
+
|
|
394
|
+
4. **Verify Improvements**
|
|
395
|
+
- Re-test after changes
|
|
396
|
+
- Ensure scores reach 90+
|
|
397
|
+
- Confirm Core Web Vitals are "Good"
|
|
398
|
+
|
|
399
|
+
## Common Mistakes to Avoid
|
|
400
|
+
|
|
401
|
+
### โ Focusing Only on Lab Data
|
|
402
|
+
|
|
403
|
+
**Problem**: Optimizing only for Lighthouse scores without considering real user data.
|
|
404
|
+
|
|
405
|
+
**โ
Solution**: Balance both lab and field data. Field data shows real-world performance.
|
|
406
|
+
|
|
407
|
+
### โ Over-Optimizing
|
|
408
|
+
|
|
409
|
+
**Problem**: Implementing too many optimizations at once, making debugging difficult.
|
|
410
|
+
|
|
411
|
+
**โ
Solution**: Make incremental changes and test after each optimization.
|
|
412
|
+
|
|
413
|
+
### โ Ignoring Mobile Performance
|
|
414
|
+
|
|
415
|
+
**Problem**: Optimizing only for desktop.
|
|
416
|
+
|
|
417
|
+
**โ
Solution**: Mobile-first approach. Most users are on mobile devices.
|
|
418
|
+
|
|
419
|
+
### โ Not Testing After Changes
|
|
420
|
+
|
|
421
|
+
**Problem**: Assuming optimizations worked without verification.
|
|
422
|
+
|
|
423
|
+
**โ
Solution**: Always re-run PageSpeed Insights after implementing changes.
|
|
424
|
+
|
|
425
|
+
## Performance Optimization Priority
|
|
426
|
+
|
|
427
|
+
1. **Critical Path**: Optimize resources needed for initial render
|
|
428
|
+
2. **Core Web Vitals**: Focus on LCP, CLS, and INP first
|
|
429
|
+
3. **Render-Blocking**: Eliminate blocking CSS and JS
|
|
430
|
+
4. **Images**: Optimize largest contentful paint element
|
|
431
|
+
5. **Third-Party**: Minimize impact of external scripts
|
|
432
|
+
6. **Caching**: Implement proper caching strategies
|
|
433
|
+
|
|
434
|
+
## Additional Resources
|
|
435
|
+
|
|
436
|
+
- [reference.md](reference.md) โ Official PageSpeed, Lighthouse, Core Web Vitals, optimization guides โ indexable
|
|
437
|
+
- **Official**: https://developers.google.com/speed/docs/insights/v5/about?hl=es-419
|
|
438
|
+
- **PageSpeed Insights**: https://pagespeed.web.dev/
|
|
439
|
+
- **Lighthouse**: Built into Chrome DevTools
|
|
440
|
+
- **Web Vitals**: https://web.dev/vitals/
|
|
441
|
+
|
|
442
|
+
## Specification Reference
|
|
443
|
+
|
|
444
|
+
This skill is based on the official [PageSpeed Insights documentation](https://developers.google.com/speed/docs/insights/v5/about?hl=es-419) from Google Developers.
|
|
445
|
+
|
|
446
|
+
All thresholds, metrics, and best practices in this skill follow the official PageSpeed Insights guidelines and Core Web Vitals specifications. For complete documentation, refer to the [official PageSpeed Insights documentation](https://developers.google.com/speed/docs/insights/v5/about?hl=es-419).
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# PageSpeed Insights โ Reference & Official Documentation
|
|
2
|
+
|
|
3
|
+
This file complements the pagespeed-insights skill with official documentation links for indexing.
|
|
4
|
+
|
|
5
|
+
## Official documentation (indexable)
|
|
6
|
+
|
|
7
|
+
- **PageSpeed Insights about**: https://developers.google.com/speed/docs/insights/v5/about?hl=es-419
|
|
8
|
+
- **PageSpeed Insights (tool)**: https://pagespeed.web.dev/
|
|
9
|
+
- **Lighthouse**: https://developer.chrome.com/docs/lighthouse/
|
|
10
|
+
- **Core Web Vitals**: https://web.dev/vitals/
|
|
11
|
+
- **Chrome User Experience Report (CrUX)**: https://developer.chrome.com/docs/crux/
|
|
12
|
+
|
|
13
|
+
## Core Web Vitals (metrics)
|
|
14
|
+
|
|
15
|
+
- **LCP (Largest Contentful Paint)**: https://web.dev/lcp/
|
|
16
|
+
- **FCP (First Contentful Paint)**: https://web.dev/fcp/
|
|
17
|
+
- **CLS (Cumulative Layout Shift)**: https://web.dev/cls/
|
|
18
|
+
- **INP (Interaction to Next Paint)**: https://web.dev/inp/
|
|
19
|
+
- **TTFB (Time to First Byte)**: https://web.dev/ttfb/
|
|
20
|
+
|
|
21
|
+
## Lab vs field data
|
|
22
|
+
|
|
23
|
+
- **Lab data**: Lighthouse, controlled environment, debugging
|
|
24
|
+
- **Field data**: CrUX, real user metrics, 28-day aggregation
|
|
25
|
+
- **Understanding metrics**: https://web.dev/metrics/
|
|
26
|
+
|
|
27
|
+
## Performance optimization guides
|
|
28
|
+
|
|
29
|
+
- **Optimize LCP**: https://web.dev/optimize-lcp/
|
|
30
|
+
- **Optimize CLS**: https://web.dev/optimize-cls/
|
|
31
|
+
- **Optimize INP**: https://web.dev/optimize-inp/
|
|
32
|
+
- **Optimize FCP**: https://web.dev/optimize-fcp/
|
|
33
|
+
- **Resource hints**: https://web.dev/preconnect-and-dns-prefetch/
|
|
34
|
+
- **Image optimization**: https://web.dev/fast/#optimize-your-images
|
|
35
|
+
|
|
36
|
+
## Tools
|
|
37
|
+
|
|
38
|
+
- **PageSpeed Insights**: https://pagespeed.web.dev/
|
|
39
|
+
- **Lighthouse (Chrome DevTools)**: Built-in, Audits tab
|
|
40
|
+
- **Web Vitals extension**: Real-time monitoring
|
|
41
|
+
- **Chromatic (Lighthouse CI)**: https://github.com/GoogleChrome/lighthouse-ci
|
|
42
|
+
|
|
43
|
+
## Score thresholds (reminder)
|
|
44
|
+
|
|
45
|
+
| Category | Good | Needs Improvement | Poor |
|
|
46
|
+
|----------|------|-------------------|------|
|
|
47
|
+
| Performance | 90-100 | 50-89 | 0-49 |
|
|
48
|
+
| Accessibility | 90-100 | 50-89 | 0-49 |
|
|
49
|
+
| Best Practices | 90-100 | 50-89 | 0-49 |
|
|
50
|
+
| SEO | 90-100 | 50-89 | 0-49 |
|
package/obj/template/CLAUDE.md
CHANGED
|
@@ -267,15 +267,15 @@ The vendored `impeccable` skill stays untouched (Article IX). `design-ui` is the
|
|
|
267
267
|
|
|
268
268
|
## Article XI โ Skill provenance and the baseline manifest
|
|
269
269
|
|
|
270
|
-
|
|
270
|
+
A skill at `.claude/skills/<slug>/SKILL.md` is **baseline-owned** iff its YAML frontmatter declares `owner: baseline`. Every other skill on disk โ those without an `owner:` field, or those declaring `owner: user` โ is user/third-party and out-of-scope of baseline audit checks. Absence-of-`owner` is the deliberate default so a project with pre-existing skills can install the baseline without annotating any of its own files. The build script `scripts/build-manifest.mjs` reads each `owner:` value and emits the canonical baseline-skill set into `obj/template/manifest.json` under `owners.skills` (a JSON object mapping slug โ `"baseline"`). The CLI mirrors this manifest verbatim to `<target>/.claude/.baseline-manifest.json` on install. The audit at `.claude/skills/audit-baseline/audit.sh` consumes `manifest.owners.skills` as the canonical baseline-skill enumeration โ the previous hard-coded `EXPECTED_SKILLS` set is removed.
|
|
271
271
|
|
|
272
272
|
You SHALL:
|
|
273
273
|
|
|
274
|
-
1. **Declare ownership.**
|
|
274
|
+
1. **Declare baseline ownership only.** A SKILL.md that ships in the baseline SHALL declare `owner: baseline` in its frontmatter directly after `name:`. Authoring a user/third-party skill does NOT require any `owner:` annotation โ absence is the default. Explicit `owner: user` is permitted but never required. The only frontmatter-related FAIL the audit emits is `invalid owner=<value>` (a present-but-malformed `owner:` field, e.g. typo). Missing-`owner:` is silently skipped.
|
|
275
275
|
2. **Trust the manifest.** The shipped `obj/template/manifest.json` (mirrored to `<target>/.claude/.baseline-manifest.json` on install) is the canonical record of baseline-owned skills and their content hashes. You SHALL NOT maintain a separate hard-coded list of baseline-skill slugs anywhere in the codebase.
|
|
276
276
|
3. **Re-derive on drift.** The audit re-derives sha256 hashes from `manifest.files` for every path under `.claude/skills/<slug>/` whose slug appears in `owners.skills`, and compares against on-disk content. Mismatches surface as `hash mismatch at <path>`. A baseline-listed slug missing from disk surfaces as `baseline skill missing`. These are hard FAIL โ drift detection has no opt-out.
|
|
277
277
|
4. **Preserve constitutional citation.** This Article XI SHALL remain in CLAUDE.md AND in `src/CLAUDE.template.md` (byte-equal mirror). The genesis ยง17 in `docs/init/seed.md` SHALL remain present, with `src/seed.template.md` mirroring it. The audit verifies both citations and reports `CLAUDE.md missing Article XI citation` or `seed.md missing ยง17 citation` on absence.
|
|
278
|
-
5. **
|
|
278
|
+
5. **Out-of-scope skills don't break the audit.** Any skill on disk that doesn't declare `owner: baseline` is out-of-scope: excluded from the baseline count, the names-match check, and the hash-drift check. Installing the baseline into a project that already has its own skills is zero-friction โ no per-file annotation required. Maintenance of those skills is the user's responsibility.
|
|
279
279
|
|
|
280
280
|
Cryptographic supply-chain attestation, signed lock files, and per-skill aggregate merkle hashes are non-goals. The per-file `manifest.files` map already covers every file in every skill directory. A future `npx @friedbotstudio/create-baseline upgrade` subcommand will consume `manifest.owners.skills` + `manifest.files` to re-overlay baseline-owned files safely while leaving user-added or locally-customized files untouched โ that subcommand is out of scope of this Article.
|
|
281
281
|
|
|
@@ -576,9 +576,9 @@ Until `/init-project` runs, this section stays empty. Once populated, every fiel
|
|
|
576
576
|
|
|
577
577
|
## ยง17 โ Skill provenance and the baseline manifest
|
|
578
578
|
|
|
579
|
-
|
|
579
|
+
A skill at `.claude/skills/<slug>/SKILL.md` is **baseline-owned** iff its YAML frontmatter declares `owner: baseline`. Baseline-owned skills are those that ship with the baseline; every other skill on disk โ those without an `owner:` field, or those declaring `owner: user` โ is user/third-party and out-of-scope of baseline audit checks. Absence-of-`owner` is the deliberate default so a project that already has its own skills can install the baseline without annotating any of those files. The build script `scripts/build-manifest.mjs` reads each `owner:` value at release time and emits the canonical baseline-skill set into `obj/template/manifest.json` under `owners.skills` (a JSON object mapping slug โ `"baseline"`). The CLI mirrors this manifest verbatim to `<target>/.claude/.baseline-manifest.json` on `freshInstall`/`forceInstall`/`merge`.
|
|
580
580
|
|
|
581
|
-
The audit at `.claude/skills/audit-baseline/audit.sh` consumes `manifest.owners.skills` as the canonical baseline-skill enumeration (replacing the previous hard-coded `EXPECTED_SKILLS` set). For every baseline-owned skill, the audit re-derives sha256 hashes from `manifest.files` and compares against on-disk content; a mismatch is reported as `hash mismatch at <path>` against the named slug. A baseline skill present in the manifest but absent from disk is reported as `baseline skill missing`. A SKILL.md
|
|
581
|
+
The audit at `.claude/skills/audit-baseline/audit.sh` consumes `manifest.owners.skills` as the canonical baseline-skill enumeration (replacing the previous hard-coded `EXPECTED_SKILLS` set). For every baseline-owned skill, the audit re-derives sha256 hashes from `manifest.files` and compares against on-disk content; a mismatch is reported as `hash mismatch at <path>` against the named slug. A baseline skill present in the manifest but absent from disk is reported as `baseline skill missing`. A SKILL.md whose `owner:` field is present but carries an invalid value (anything other than `baseline` or `user`) is reported as `invalid owner=<value>`. SKILL.md files without an `owner:` field are treated as user/third-party and silently skipped โ they are excluded from the baseline count, the names-match check, and the hash-drift check, so installing the baseline into a project that already has its own skills never breaks the audit.
|
|
582
582
|
|
|
583
583
|
The audit also verifies constitutional citation: CLAUDE.md SHALL contain the literal string "Article XI" and a reference to the manifest, and `docs/init/seed.md` SHALL contain "ยง17" and a manifest reference. Missing citations trigger FAIL with `CLAUDE.md missing Article XI citation` or `seed.md missing ยง17 citation`.
|
|
584
584
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"manifest_version": 2,
|
|
3
|
-
"generated_at": "2026-05-
|
|
3
|
+
"generated_at": "2026-05-14T22:27:15.062Z",
|
|
4
4
|
"files": {
|
|
5
5
|
".claude/agents/swarm-worker.md": "1735a220f268c9765cb22e0567b728803f2edd7776cbde51dd017a9f062ae41f",
|
|
6
6
|
".claude/bin/LICENSE": "a8dcf2775ab71a58c7d4cc935e3a8e9974e87bb7d6082ee25ef52f8140be8e07",
|
|
@@ -15,7 +15,6 @@
|
|
|
15
15
|
".claude/hooks/env_guard.sh": "76ffc98fa9a2709526715132981699e46043183e2b1d043a05744a40384d1361",
|
|
16
16
|
".claude/hooks/git_commit_guard.sh": "1a78799f35cae7b52ee29d8adcddc5cd29427822c223a3be6e0d181f1e8e71c2",
|
|
17
17
|
".claude/hooks/harness_continuation.sh": "81b40138a66b24d93fcd8fde57f2f21804667952f466d84c2af7c9307c75b117",
|
|
18
|
-
".claude/hooks/lib/__pycache__/resume_writer.cpython-314.pyc": "4c9afd22f475848f4007111bf325b406924faef16a6e90e963399febf3075cab",
|
|
19
18
|
".claude/hooks/lib/common.sh": "2c72b867acf08550f62f80c6b57024d35edd74260a9fd7ac6c709e71fd812319",
|
|
20
19
|
".claude/hooks/lib/resume_writer.py": "9592fb72de966cb797e51322fbf0160a6784de34934bd6587768689a34bd03b5",
|
|
21
20
|
".claude/hooks/lint_runner.sh": "267e08dbd9af246c0af124c32ad4aeac48dfe20ac926244ed89855deb7ff7940",
|
|
@@ -50,7 +49,7 @@
|
|
|
50
49
|
".claude/skills/archive/SKILL.md": "5174e8b72ab1e830912c231052d1e535023d58f0808434fe1d4abce305b80318",
|
|
51
50
|
".claude/skills/archive/archive.sh": "29f5b3c8870d0665ce624c6d1b5770f691f1d19f82a201767d5685fc3b0a0b58",
|
|
52
51
|
".claude/skills/audit-baseline/SKILL.md": "86e9955a99ade89074571320b2b9b0780bc033d201968f62edcca35d9e25f7cb",
|
|
53
|
-
".claude/skills/audit-baseline/audit.sh": "
|
|
52
|
+
".claude/skills/audit-baseline/audit.sh": "76eb4e9e58c31fc4d7258427473b1e4cdf7c3a63cbb065b4139fe4a1b4f1eee7",
|
|
54
53
|
".claude/skills/brd/SKILL.md": "260e5d18396de21b6842ad0bc5fe74b0e124f3c2e2a4ac2867eeb543c7c2c0a3",
|
|
55
54
|
".claude/skills/brd/template.md": "be4095b4bed70fcebc821ad92b0217db4fee1afb9a341a9e704d2c1869ec6f43",
|
|
56
55
|
".claude/skills/chore/SKILL.md": "66efdcf992a7e56db97c0c1e81abe229263fd4bba976e1f21a23cf4dca705920",
|
|
@@ -76,6 +75,22 @@
|
|
|
76
75
|
".claude/skills/design-ui/references/state-machine.md": "e15b121bc4dbb5fb2926d9dca8dc08d03c6b60875b420ca50898f1de5aaa7c9e",
|
|
77
76
|
".claude/skills/document/SKILL.md": "7345488fe50923c273dfdf3277ec7251fee9184bc7de1a12192255b5ad183fda",
|
|
78
77
|
".claude/skills/documentation/SKILL.md": "456160c1a3398cfece91b6696d0c7f1fcb1196ea5e101acb9a0e3050f2462a5d",
|
|
78
|
+
".claude/skills/google-analytics/SKILL.md": "f5d8c52c103e4e1bdbb6bfdda962aad198064ced701c20df753d77ba4603547c",
|
|
79
|
+
".claude/skills/google-analytics/references/audiences.md": "cdae62b0f40e82a60f96a6bd0e77798c6118beaebe812961e8c9d4c3242b227f",
|
|
80
|
+
".claude/skills/google-analytics/references/bigquery.md": "fadc3efdd200a0bc43df4b698d46bc93e82111d8553b363d1e49ceb15bcdffce",
|
|
81
|
+
".claude/skills/google-analytics/references/custom-dimensions.md": "ac9e88c69fd8eb2a0bf1ae8f3daac42c6d92caa338ce2fa77a50bf2fe947dbc4",
|
|
82
|
+
".claude/skills/google-analytics/references/custom-events.md": "442ce8c1e7d89cb2206a85b02b287748e3e226d67cab571bc6f2a3ea520bc434",
|
|
83
|
+
".claude/skills/google-analytics/references/data-management.md": "1f9e80e0855937dc082d63535188fc1e7547273e626d0a3ef03c0487b42045bb",
|
|
84
|
+
".claude/skills/google-analytics/references/debugview.md": "f2b050db37b7927de99b0196deb7cb94d8ecb1a6668c9e08bec4f57816646e90",
|
|
85
|
+
".claude/skills/google-analytics/references/events-fundamentals.md": "acdeb349be2f468ba634d686691aeda0ce932db93b4872b9cd35685dcd3f31cf",
|
|
86
|
+
".claude/skills/google-analytics/references/gtag.md": "bef0556071bc645656d0634c26c3bad20d39517cb14689bb11e9d9bedf4f6ab8",
|
|
87
|
+
".claude/skills/google-analytics/references/gtm-integration.md": "3c95c7b64fbbd688907cd558c3c4d265b99c7178284b97e376334d802d11c860",
|
|
88
|
+
".claude/skills/google-analytics/references/measurement-protocol.md": "a5b644a5ca586173e399c229a47aad571991389232320a0f9e6baf1d4be619fb",
|
|
89
|
+
".claude/skills/google-analytics/references/privacy.md": "09e2db4ce4d990f4f1ff51c0e3bca08a364cba711f83f48103f69f9db427fa18",
|
|
90
|
+
".claude/skills/google-analytics/references/recommended-events.md": "0dccd2084060bfb3fd28476b9c0c9a6e2b8f51ce57ecf4fc32d7f82a8964b1b4",
|
|
91
|
+
".claude/skills/google-analytics/references/reporting.md": "37cb7cfd1dd547e86a41664ffe13893ef138194a2288d1a2c43c9195e8ec609f",
|
|
92
|
+
".claude/skills/google-analytics/references/setup.md": "26743b72341a5658e73c1f070b924de0f11b1681af06164cb13c19f2047a1087",
|
|
93
|
+
".claude/skills/google-analytics/references/user-tracking.md": "5a945df2a575291c6b35d24830b497915c82a843a93ee133577f1deda93f6d75",
|
|
79
94
|
".claude/skills/harness/SKILL.md": "f758faec70974e61b558e93055f8267f39f51816759a645b89a28ff362e18eb6",
|
|
80
95
|
".claude/skills/humanizer/SKILL.md": "398beef0cabe34df435972a13fb9ef21be74d942f93321b220a5dd393d554e40",
|
|
81
96
|
".claude/skills/humanizer/references/ai-writing-detection.md": "e896c1b31f7af57b8cda81df6ded6e9d7e9ab742a0f5fdfc73f88a6be2e78f2b",
|
|
@@ -139,6 +154,11 @@
|
|
|
139
154
|
".claude/skills/memory-flush/SKILL.md": "ad971b4aef6820e0ae926812e499ed65496f6b14de57db04a5e9ebc440754631",
|
|
140
155
|
".claude/skills/memory-flush/sweep.py": "ebca5b2e09c021a61f434822cf693d552407cf52f753979dc403310666d490b6",
|
|
141
156
|
".claude/skills/memory-flush/tests/run.sh": "aa20d8f6057c3d34fd72ab1aca2c2dc498dede36497f68e5576547a755c8c315",
|
|
157
|
+
".claude/skills/optimize-seo/SKILL.md": "b389dc604346220d5a0a59c8f41c058c192c58a35bbff831fbc4c7f9e8c1b386",
|
|
158
|
+
".claude/skills/optimize-seo/scripts/pagespeed.mjs": "8bef62078833139f9175c175339d1fc0eb635a5eeaa2a3100543928ef91869e4",
|
|
159
|
+
".claude/skills/pagespeed-insights/LICENSE.md": "10ee2ded8c2ae373a65aacfa51f2bf540d5f20d418fc7a5595a5ccb06cde2738",
|
|
160
|
+
".claude/skills/pagespeed-insights/SKILL.md": "ab53af083929fbb28af0ad2c9ee1fcc51dec63c642ebc237c475b3ea9bde7c59",
|
|
161
|
+
".claude/skills/pagespeed-insights/reference.md": "afa03220b772ea8d6393f7366bbd6d90200c0b56585ccb2bb714e622af07345f",
|
|
142
162
|
".claude/skills/prose/SKILL.md": "7cfc7d4fd34d7256367eedf17c5f5b5cdb67baec72033f905dcfb715366a1849",
|
|
143
163
|
".claude/skills/rca/SKILL.md": "e5d1285df6d627052cfd62c3c8900bbd847ae92b37d245e8d6c2cc34c7fc32c5",
|
|
144
164
|
".claude/skills/rca/template.md": "8466f5737a0aeb88bcb73d4d4065293e2ff59f0c0e19de4082598d4e920caeb9",
|
|
@@ -168,8 +188,8 @@
|
|
|
168
188
|
".claude/skills/triage/SKILL.md": "1a26797795bec07d57bf61ced22c1d271124ec32ae858f4cb10e0cd3a78cfdf3",
|
|
169
189
|
".claude/skills/verify/SKILL.md": "fcddba67cf7f3623fc8f8ae142303b16b9db0c9fc1652bc920e16c56fe4c7864",
|
|
170
190
|
".mcp.json": "8ebb7966045486187bbdf9bac643e690c4fbc7a9a70a8345e3665ba72fa19b96",
|
|
171
|
-
"CLAUDE.md": "
|
|
172
|
-
"docs/init/seed.md": "
|
|
191
|
+
"CLAUDE.md": "1bdd48d3f69c491a8dddac7b61adb72b84a54ad927a048e48e8537c2a86ef4e2",
|
|
192
|
+
"docs/init/seed.md": "76f059186b31c8e01724f3dce4c70a71a20594ee301073458c611655a6c208d9"
|
|
173
193
|
},
|
|
174
194
|
"owners": {
|
|
175
195
|
"skills": {
|
|
@@ -210,5 +230,6 @@
|
|
|
210
230
|
"triage": "baseline",
|
|
211
231
|
"verify": "baseline"
|
|
212
232
|
}
|
|
213
|
-
}
|
|
233
|
+
},
|
|
234
|
+
"build_id": "gha-25889207503"
|
|
214
235
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@friedbotstudio/create-baseline",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Zero-dependency Node CLI scaffolder that materializes the Claude Code baseline (hooks, skills, commands, MCP servers, governance docs) into a target project. Run via `npx @friedbotstudio/create-baseline <target>`.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"build:site": "eleventy",
|
|
23
23
|
"dev:site": "eleventy --serve --port=4321",
|
|
24
24
|
"publish:check": "bash scripts/publish-check.sh",
|
|
25
|
-
"publish:precheck": "npm
|
|
25
|
+
"publish:precheck": "npm pack --dry-run",
|
|
26
26
|
"publish:files-diff": "node scripts/check-files-diff.mjs",
|
|
27
27
|
"publish:smoke": "node scripts/smoke-tarball.mjs",
|
|
28
28
|
"release": "semantic-release"
|
|
@@ -38,6 +38,11 @@
|
|
|
38
38
|
"type": "git",
|
|
39
39
|
"url": "git+https://github.com/friedbotstudio/baseline.git"
|
|
40
40
|
},
|
|
41
|
+
"author": {
|
|
42
|
+
"name": "Friedbot Studio Pvt Ltd",
|
|
43
|
+
"email": "hello@friedbotstudio.com"
|
|
44
|
+
},
|
|
45
|
+
"homepage": "https://baseline.friedbotstudio.com",
|
|
41
46
|
"devDependencies": {
|
|
42
47
|
"@11ty/eleventy": "3.1.5",
|
|
43
48
|
"@semantic-release/changelog": "6.0.3",
|