@primer/brand-mcp 0.72.0-rc.44ea78b6 → 0.72.0-rc.8a25c4ef
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/content/page-design.md +29 -121
- package/dist/catalog.json +2 -2
- package/dist/review/rules.js +3 -29
- package/dist/review/rules.js.map +1 -1
- package/dist/tools/primer-brand-examples/primer-brand-examples.js +6 -39
- package/dist/tools/primer-brand-examples/primer-brand-examples.js.map +1 -1
- package/package.json +1 -1
package/content/page-design.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Page design patterns
|
|
2
2
|
|
|
3
|
-
These page
|
|
3
|
+
These are the page design guidelines for GitHub marketing and landing pages, beyond what the component APIs or documentation guidelines recommend. Apply these by default unless the brief says otherwise. These are **design conventions** and the `primer_brand_review` tool does not flag them, so consult this before composing a page.
|
|
4
4
|
|
|
5
5
|
Learn individual component APIs and usage with `primer_brand_docs` and `primer_brand_component`. This guide is the step after: how to lay out an entire page and use those components alongside your custom ones correctly.
|
|
6
6
|
|
|
@@ -36,161 +36,69 @@ Every full page should be framed top and bottom, unless the user has requested a
|
|
|
36
36
|
|
|
37
37
|
### Contain content within the grid
|
|
38
38
|
|
|
39
|
-
Body content must sit in
|
|
39
|
+
Body content must always sit in a centered, max-width column framed by the brand's gridlines — it should rarely stretch edge-to-edge.
|
|
40
40
|
|
|
41
41
|
Examples of this are in the Flexsuite recipes.
|
|
42
42
|
|
|
43
|
-
- **Do** — keep heroes,
|
|
44
|
-
- **Don't** —
|
|
43
|
+
- **Do** — keep content (heroes, rivers, tables, card grids, CTAs, prose) in a shared max-width column with clear left and right gutters, and let thin ruled gridlines run down both sides of the column with full-bleed horizontal rules between major sections.
|
|
44
|
+
- **Don't** — stretch tables, card grids, CTAs, or text edge-to-edge, or let a section bleed full-width unless it is a deliberate background band.
|
|
45
45
|
- **Mobile** — use a modest, consistent side inset and make sure nothing overflows the viewport.
|
|
46
46
|
|
|
47
47
|
Resolve gutter, inset, and gridline (border) values with `primer_brand_tokens`; don't hardcode hex or pixel values.
|
|
48
48
|
|
|
49
|
-
###
|
|
49
|
+
### Spacing
|
|
50
50
|
|
|
51
51
|
Generous spacing is what lets a layout breathe; the Flexsuite recipes are a good reference for the rhythm to aim for.
|
|
52
52
|
|
|
53
|
-
- **Do** — use `Box` and `Stack` responsive spacing props
|
|
54
|
-
- **Do** — match the canonical wide `Grid` / container gutter instead of reproducing reviewed measurements as hardcoded values.
|
|
53
|
+
- **Do** — use `Box` and `Stack` (both have responsive spacing props) to add consistent rhythm between sections, and take spacing steps from the standard scale so gaps repeat predictably across sections and inside cards.
|
|
55
54
|
- **Don't** — pack sections edge-to-edge, hand-roll ad-hoc margins, or invent one-off gap values.
|
|
56
55
|
|
|
57
56
|
### Typographic hierarchy
|
|
58
57
|
|
|
59
58
|
A page has one clear headline and a calm step-down from there.
|
|
60
59
|
|
|
61
|
-
- **Do** — use a single hero heading, make secondary section headings a clear step smaller, and
|
|
60
|
+
- **Do** — use a single hero heading, make secondary section headings a clear step smaller, and set body copy at the standard body size and weight. Left-align long-form copy; reserve centering for short hero or section intros.
|
|
62
61
|
- **Don't** — size secondary headings close to the hero, set body text in heavy weights, or center long paragraphs.
|
|
63
62
|
|
|
64
63
|
Resolve exact sizes and weights with `primer_brand_tokens`.
|
|
65
64
|
|
|
66
65
|
## Component & element patterns
|
|
67
66
|
|
|
68
|
-
###
|
|
67
|
+
### Heroes carry media
|
|
69
68
|
|
|
70
|
-
|
|
69
|
+
A text-only hero reads as unfinished; heroes should carry a visual and lead with a label.
|
|
71
70
|
|
|
72
|
-
-
|
|
73
|
-
-
|
|
74
|
-
- If needed, place custom media after `Hero`; use `trailingComponent` only when it must live inside the Hero composition.
|
|
71
|
+
- **Do** — give `Hero` a `Hero.Image` (or `Hero.Video`); source imagery from `primer_brand_asset` (Octovisuals) or generate it with the Asset Generator MCP (see _Generated imagery_ below). Lead the hero with an eyebrow label (see _Labels hug their content_), and bound decorative or illustrative media with a set aspect ratio and max height so it stays inside the grid.
|
|
72
|
+
- **Don't** — ship a bare, text-only hero, drop the eyebrow, or let an illustration run arbitrarily tall or bleed full-width.
|
|
75
73
|
|
|
76
|
-
|
|
74
|
+
### Generated imagery adds color and interest
|
|
77
75
|
|
|
78
|
-
-
|
|
79
|
-
- Let decorative or illustrative Hero media grow arbitrarily tall or bleed outside the shared grid.
|
|
76
|
+
Bring on-brand color and life to the page with the Asset Generator MCP (when installed) instead of leaving large areas flat — most pages want at least one generated visual.
|
|
80
77
|
|
|
81
|
-
|
|
78
|
+
- **Do** — use **`create_product_landscape`** when the visual demos a product or feature (a hero or section showing the thing itself), and **`create_wallpaper`** for everything else, to add a colorful on-brand backdrop or accent. Browse the current set with `list_templates` / `list_themes` and pick a theme that fits the page's topic.
|
|
79
|
+
- **Don't** — reach for social media-specific templates like `create_social_square` or `create_landscape` when a product shot or wallpaper fits better.
|
|
82
80
|
|
|
83
|
-
|
|
81
|
+
### Group cards inside gridlines
|
|
84
82
|
|
|
85
|
-
|
|
86
|
-
- Keep River descriptions to a maximum of 160 characters.
|
|
87
|
-
- Prefer the default `50:50` image-to-text ratio where possible; set `imageTextRatio="60:40"` only when the visual needs more space or emphasis.
|
|
83
|
+
A grid of items (features, pathways, plans) uses the connected **gridline** grid, not floating cards.
|
|
88
84
|
|
|
89
|
-
**
|
|
85
|
+
- **Do** — render a `Grid` with `columnGap="none" rowGap="none" enableGutters={false}` inside a bordered frame and let the frame draw the shared lines. Refer to the Flexsuite recipes for an example of this.
|
|
86
|
+
- **Don't** — output separate bordered `Card`s with gaps between them.
|
|
90
87
|
|
|
91
|
-
|
|
88
|
+
### Labels hug their content
|
|
92
89
|
|
|
93
|
-
|
|
90
|
+
Lead heroes and sections with an eyebrow/section label; it is intrinsic width, and stretching it reads as off-brand.
|
|
94
91
|
|
|
95
|
-
**Do**
|
|
92
|
+
- **Do** — use `Hero.Label` / `SectionIntro.Label` / `EyebrowText` for the standard treatment (a short, monospace, uppercase label) and let it size to its content; alignment follows the section (start by default, or centered inside a centered `SectionIntro`).
|
|
93
|
+
- **Don't** — set a label full-width, give it a block/full-bleed background, or hand-style your own instead of the label components.
|
|
96
94
|
|
|
97
|
-
|
|
98
|
-
- Draw shared dividers on custom frame/cell wrappers and use `border-radius: 0` there.
|
|
95
|
+
### Sweat the small details
|
|
99
96
|
|
|
100
|
-
|
|
97
|
+
Small, repeated treatments are where a page quietly drifts off-brand.
|
|
101
98
|
|
|
102
|
-
-
|
|
103
|
-
- `Pillar` has no
|
|
99
|
+
- **Do** — use dot bullets for lists; keep buttons in their real interactive states (hover/active) and use a `Button` for a primary CTA rather than a bare link; show FAQ/accordion category navigation only when there are several categories; leave `Icon` at its default color — which renders green — wherever Octicons appear (`Card.Icon`, `Pillar.Icon`, and standalone `Icon`) so icons read as one consistent accent.
|
|
100
|
+
- **Don't** — use dashes as bullets, add divider rules between list items or sections, ship flat/stateless buttons, render an empty single-category sidebar, or override the `color` prop on `Icon` or `Card.Icon` to tint icons off-green without a strong, deliberate reason (`Pillar.Icon` has no `color` prop — it's already locked to green).
|
|
104
101
|
|
|
105
|
-
|
|
102
|
+
## General guidance
|
|
106
103
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
- Without media, use the default `CTABanner` with `align="center"` and `hasGridLines`.
|
|
110
|
-
- With media, use `<CTABanner variant="balanced" hasGridLines>` with a direct `CTABanner.Image`. Use Octovisuals for artwork; reserve `CTABanner.Logo` for genuine logos.
|
|
111
|
-
|
|
112
|
-
**Don't**
|
|
113
|
-
|
|
114
|
-
- Use `CTABanner variant="balanced"` without a direct `CTABanner.Image`, or use `CTABanner.Logo` for decorative artwork.
|
|
115
|
-
|
|
116
|
-
### Forms
|
|
117
|
-
|
|
118
|
-
**Do**
|
|
119
|
-
|
|
120
|
-
- Use a square, zero-gap `Grid` with connected benefits beside a subtle form surface. Use responsive token gutters, Primer Brand form controls, and an enabled `<Button variant="primary" type="submit">`.
|
|
121
|
-
|
|
122
|
-
**Don't**
|
|
123
|
-
|
|
124
|
-
- Use raw form controls or put the form section in a floating rounded panel.
|
|
125
|
-
|
|
126
|
-
### FAQs
|
|
127
|
-
|
|
128
|
-
**Do**
|
|
129
|
-
|
|
130
|
-
- Use `FAQGroup` navigation for multiple meaningful categories and one `FAQ` directly for a single category.
|
|
131
|
-
|
|
132
|
-
**Don't**
|
|
133
|
-
|
|
134
|
-
- Show `FAQGroup` navigation for a single category.
|
|
135
|
-
|
|
136
|
-
### Section backgrounds
|
|
137
|
-
|
|
138
|
-
**Do**
|
|
139
|
-
|
|
140
|
-
- Keep one default background across sections. Use `backgroundColor="subtle"` only to clarify a functional region.
|
|
141
|
-
|
|
142
|
-
**Don't**
|
|
143
|
-
|
|
144
|
-
- Alternate section background colors merely for decoration.
|
|
145
|
-
|
|
146
|
-
### Labels
|
|
147
|
-
|
|
148
|
-
**Do**
|
|
149
|
-
|
|
150
|
-
- Use `Hero.Label`, `SectionIntro.Label`, or `EyebrowText`; keep labels intrinsic-width and aligned with their section.
|
|
151
|
-
|
|
152
|
-
**Don't**
|
|
153
|
-
|
|
154
|
-
- Stretch Label components full-width or hand-style replacements for the label components. Labels should preserve their auto width; don't let the parent stretch them.
|
|
155
|
-
|
|
156
|
-
### Lists
|
|
157
|
-
|
|
158
|
-
**Do**
|
|
159
|
-
|
|
160
|
-
- Use dot bullets without decorative dividers between items.
|
|
161
|
-
|
|
162
|
-
**Don't**
|
|
163
|
-
|
|
164
|
-
- Use dashes as bullets.
|
|
165
|
-
|
|
166
|
-
### Buttons
|
|
167
|
-
|
|
168
|
-
**Do**
|
|
169
|
-
|
|
170
|
-
- Show enabled controls with a clear primary/secondary hierarchy.
|
|
171
|
-
|
|
172
|
-
**Don't**
|
|
173
|
-
|
|
174
|
-
- Make normal controls look disabled.
|
|
175
|
-
|
|
176
|
-
### Icons
|
|
177
|
-
|
|
178
|
-
**Do**
|
|
179
|
-
|
|
180
|
-
- Keep Octicons at the default green in `Card.Icon`, `Pillar.Icon`, and `Icon` unless there is a deliberate exception.
|
|
181
|
-
|
|
182
|
-
**Don't**
|
|
183
|
-
|
|
184
|
-
- Tint default-green Octicons without a deliberate reason. `Pillar.Icon` has no `color` prop.
|
|
185
|
-
|
|
186
|
-
## Visual verification
|
|
187
|
-
|
|
188
|
-
When browser tooling is available, screenshot desktop, tablet, and mobile. Check that:
|
|
189
|
-
|
|
190
|
-
- Content shares one centered grid and consistent gutters.
|
|
191
|
-
- Repeated panels share square boundaries and dividers.
|
|
192
|
-
- Nothing clips, overflows, or overlaps; labels remain intrinsic-width.
|
|
193
|
-
- Hero media and images render correctly; text has sufficient contrast.
|
|
194
|
-
- Copy is real and specific, with no glows, purple gradients, pill buttons, or glassmorphism.
|
|
195
|
-
|
|
196
|
-
Fix issues and re-screenshot before finishing.
|
|
104
|
+
- If browser tooling (e.g. the Playwright MCP) is available, verify your work visually before finishing: serve the page locally, open it, and take screenshots across different breakpoints. Review the screenshots against this guidance and automatically fix obvious defects like content that bleeds edge-to-edge instead of sitting in the gridline column, clipped or overflowing content, cramped or one-off spacing, stretched/full-width labels that should preserve their intrinsic width, a hero with no eyebrow, an illustration that runs too tall, dashes used as bullets, low-contrast text, a text-only hero, broken images, and off-brand tells (glows, purple gradients, pill buttons, glassmorphism, placeholder copy). Re-screenshot to confirm the fixes.
|
package/dist/catalog.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"brandPackage": "@primer/react-brand",
|
|
3
|
-
"generatedFromVersion": "0.72.0-rc.
|
|
4
|
-
"generatedAt": "2026-07-
|
|
3
|
+
"generatedFromVersion": "0.72.0-rc.8a25c4ef",
|
|
4
|
+
"generatedAt": "2026-07-20T19:04:28.443Z",
|
|
5
5
|
"components": [
|
|
6
6
|
{
|
|
7
7
|
"name": "Hero",
|
package/dist/review/rules.js
CHANGED
|
@@ -8,7 +8,7 @@ import { evidence } from './types.js';
|
|
|
8
8
|
* hardcoded values, and avoidance of well-known off-brand visual "tells".
|
|
9
9
|
*/
|
|
10
10
|
const componentUsage = (code, name) => [
|
|
11
|
-
...code.matchAll(new RegExp(`<${escapeRegExp(name)}\\b
|
|
11
|
+
...code.matchAll(new RegExp(`<${escapeRegExp(name)}\\b[^>]*>`, 'g')),
|
|
12
12
|
];
|
|
13
13
|
/** `<Hero.Heading>` style usages of `Root.Sub`. */
|
|
14
14
|
const unknownSubcomponents = {
|
|
@@ -79,12 +79,6 @@ const invalidPropComboMap = [
|
|
|
79
79
|
disallow: { prop: 'align', value: 'center' },
|
|
80
80
|
message: 'The `Hero` `gridline-expressive` variant is always start-aligned; `align="center"` is unsupported and will be ignored — remove it (the default `align="start"` is correct).',
|
|
81
81
|
},
|
|
82
|
-
{
|
|
83
|
-
component: 'River',
|
|
84
|
-
when: { prop: 'variant', value: 'gridline' },
|
|
85
|
-
disallow: { prop: 'align', value: 'end' },
|
|
86
|
-
message: 'The `River` `gridline` variant must use a consistent start alignment; remove `align="end"` (the default `align="start"` is correct).',
|
|
87
|
-
},
|
|
88
82
|
];
|
|
89
83
|
const invalidPropCombination = {
|
|
90
84
|
id: 'invalid-prop-combination',
|
|
@@ -103,30 +97,11 @@ const invalidPropCombination = {
|
|
|
103
97
|
return findings;
|
|
104
98
|
},
|
|
105
99
|
};
|
|
106
|
-
/** Only permit balanced CTABanners when an image is present */
|
|
107
|
-
const balancedCtaRequiresImage = {
|
|
108
|
-
id: 'balanced-cta-image',
|
|
109
|
-
run(code) {
|
|
110
|
-
const findings = [];
|
|
111
|
-
const balancedCta = /<CTABanner\b(?=[^>]*\bvariant=["']balanced["'])[^>]*>([\s\S]*?)<\/CTABanner>/g;
|
|
112
|
-
for (const match of code.matchAll(balancedCta)) {
|
|
113
|
-
if (/<CTABanner\.Image\b/.test(match[1] ?? ''))
|
|
114
|
-
continue;
|
|
115
|
-
findings.push({
|
|
116
|
-
severity: 'error',
|
|
117
|
-
rule: this.id,
|
|
118
|
-
message: '`CTABanner variant="balanced"` requires a direct `CTABanner.Image` child for its two-column layout. Use the default centered banner when there is no media.',
|
|
119
|
-
evidence: evidence(match[0]),
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
return findings;
|
|
123
|
-
},
|
|
124
|
-
};
|
|
125
100
|
const RAW_HTML_PATTERNS = [
|
|
126
101
|
{
|
|
127
102
|
id: 'raw-form-elements',
|
|
128
|
-
test: /<(input|select|textarea)\b/i,
|
|
129
|
-
message: 'Raw form
|
|
103
|
+
test: /<(input|select|textarea|form)\b/i,
|
|
104
|
+
message: 'Raw form elements detected. Use Primer Brand form components (e.g. `FormControl`, `TextInput`, `Select`).',
|
|
130
105
|
},
|
|
131
106
|
{
|
|
132
107
|
id: 'raw-pricing-table',
|
|
@@ -279,7 +254,6 @@ export const allRules = [
|
|
|
279
254
|
unknownSubcomponents,
|
|
280
255
|
invalidPropValue,
|
|
281
256
|
invalidPropCombination,
|
|
282
|
-
balancedCtaRequiresImage,
|
|
283
257
|
rawHtml,
|
|
284
258
|
hardcodedValues,
|
|
285
259
|
offBrandTells,
|
package/dist/review/rules.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/review/rules.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAA0B,QAAQ,EAAC,MAAM,YAAY,CAAA;AAE5D;;;;;;GAMG;AAEH,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,IAAY,EAAsB,EAAE,CAAC;IACzE,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/review/rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,8 +7,8 @@ const inputSchema = z.object({
|
|
|
7
7
|
.optional()
|
|
8
8
|
.describe('What you are building, e.g. "education landing page" or "pricing section". Omit for a foundational starter set.'),
|
|
9
9
|
});
|
|
10
|
-
const description = `Get ranked, copy-and-adapt examples of correct Primer Brand usage for a goal.
|
|
11
|
-
Pass a target use-case like "pricing section", "category page", or "education landing page"
|
|
10
|
+
const description = `Get ranked, copy-and-adapt examples of correct Primer Brand usage for a goal. Component-level snippets come from the library's own tested Storybook stories; for page-level goals you also get a full-page template — the actual current-brand recipe source from \`@primer/react-brand\`.
|
|
11
|
+
Pass a target use-case like "pricing section", "category page", or "education landing page" for the closest matches; with no match you get a default foundational set.
|
|
12
12
|
Examples are real source, so they may carry demo scaffolding (a \`content\` object, internal fixture imports, CSS-module class names, repo-relative imports, \`{...args}\` spreads) — mirror the composition and props, then rebuild with your own content and \`@primer/react-brand\` imports. Don't paste verbatim.`;
|
|
13
13
|
/** Foundational sections that anchor almost every GitHub landing page, in composition order. */
|
|
14
14
|
const DEFAULT_COMPONENTS = ['Hero', 'SectionIntro', 'River', 'Pillar', 'CTABanner'];
|
|
@@ -23,29 +23,6 @@ export const primerBrandExamplesTool = {
|
|
|
23
23
|
annotations: { readOnlyHint: true },
|
|
24
24
|
run(input, ctx) {
|
|
25
25
|
const goal = input.goal?.trim() || 'landing page';
|
|
26
|
-
const genericPageTerms = new Set([
|
|
27
|
-
'feature',
|
|
28
|
-
'features',
|
|
29
|
-
'full',
|
|
30
|
-
'landing',
|
|
31
|
-
'lp',
|
|
32
|
-
'marketing',
|
|
33
|
-
'page',
|
|
34
|
-
'pages',
|
|
35
|
-
'product',
|
|
36
|
-
'site',
|
|
37
|
-
'template',
|
|
38
|
-
'templates',
|
|
39
|
-
'website',
|
|
40
|
-
]);
|
|
41
|
-
const meaningfulGoal = goal
|
|
42
|
-
.toLowerCase()
|
|
43
|
-
.split(/\s+/)
|
|
44
|
-
.map(term => term.replace(/^[^a-z0-9]+|[^a-z0-9-]+$/g, ''))
|
|
45
|
-
.filter(term => term && !genericPageTerms.has(term))
|
|
46
|
-
.join(' ');
|
|
47
|
-
const isPageGoal = !input.goal?.trim() ||
|
|
48
|
-
/\b(page|pages|landing|homepage|home|website|site|template|lp|overview|category|details?)\b/i.test(goal);
|
|
49
26
|
// Only surface components that actually have a tested example — never emit a stub.
|
|
50
27
|
const withExamples = ctx.catalog.components.filter(component => exampleCode(component));
|
|
51
28
|
if (withExamples.length === 0) {
|
|
@@ -54,7 +31,7 @@ export const primerBrandExamplesTool = {
|
|
|
54
31
|
isError: true,
|
|
55
32
|
};
|
|
56
33
|
}
|
|
57
|
-
const matched =
|
|
34
|
+
const matched = rank(goal, withExamples, componentSearchFields)
|
|
58
35
|
.slice(0, 6)
|
|
59
36
|
.map(entry => entry.item);
|
|
60
37
|
const useDefault = matched.length === 0;
|
|
@@ -69,17 +46,7 @@ export const primerBrandExamplesTool = {
|
|
|
69
46
|
.join('\n\n');
|
|
70
47
|
// For page-level goals, lead with the closest full-page recipe. It's the real source (single
|
|
71
48
|
// source of truth in @primer/react-brand), so tell the agent to look past its demo scaffolding.
|
|
72
|
-
const
|
|
73
|
-
recipe.name,
|
|
74
|
-
recipe.title,
|
|
75
|
-
recipe.keywords.join(' '),
|
|
76
|
-
];
|
|
77
|
-
const specificRecipes = isPageGoal && meaningfulGoal
|
|
78
|
-
? rank(meaningfulGoal, ctx.catalog.recipes, recipeSearchFields).map(entry => entry.item)
|
|
79
|
-
: [];
|
|
80
|
-
const defaultRecipe = ctx.catalog.recipes.find(recipe => recipe.name === 'FlexSuiteAIOverview');
|
|
81
|
-
const useDefaultRecipe = isPageGoal && specificRecipes.length === 0 && Boolean(defaultRecipe);
|
|
82
|
-
const matchedRecipes = specificRecipes.length > 0 ? specificRecipes : useDefaultRecipe && defaultRecipe ? [defaultRecipe] : [];
|
|
49
|
+
const matchedRecipes = rank(goal, ctx.catalog.recipes, recipe => [recipe.title, recipe.keywords.join(' ')]).map(entry => entry.item);
|
|
83
50
|
const topRecipe = matchedRecipes[0];
|
|
84
51
|
const sections = [`# Examples for "${goal}"`];
|
|
85
52
|
if (topRecipe) {
|
|
@@ -88,8 +55,8 @@ export const primerBrandExamplesTool = {
|
|
|
88
55
|
? ` Other full-page templates for this goal: ${otherRecipes.map(recipe => recipe.title).join(', ')}.`
|
|
89
56
|
: '';
|
|
90
57
|
sections.push([
|
|
91
|
-
`## Full-page template —
|
|
92
|
-
`This is the **actual current-brand recipe source** from \`@primer/react-brand\`, wired for our demo harness: a \`content\` object supplies the copy, imagery comes from internal fixtures, styling uses internal CSS-module class names, and imports are repo-relative. Ignore that scaffolding — mirror the
|
|
58
|
+
`## Full-page template — start here: ${topRecipe.title}`,
|
|
59
|
+
`This is the **actual current-brand recipe source** from \`@primer/react-brand\`, wired for our demo harness: a \`content\` object supplies the copy, imagery comes from internal fixtures, styling uses internal CSS-module class names, and imports are repo-relative. Ignore that scaffolding — mirror the composition, section order, and component props (e.g. the \`gridline\` / \`gridline-expressive\` variants and the bordered card-grid frame), then rebuild it with your own content, assets, and \`@primer/react-brand\` imports.${also}`,
|
|
93
60
|
`\`\`\`tsx\n${topRecipe.source}\n\`\`\``,
|
|
94
61
|
].join('\n\n'));
|
|
95
62
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"primer-brand-examples.js","sourceRoot":"","sources":["../../../src/tools/primer-brand-examples/primer-brand-examples.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAA;AAGrB,OAAO,EAAC,IAAI,EAAC,MAAM,oBAAoB,CAAA;AACvC,OAAO,EAAC,qBAAqB,EAAE,WAAW,EAAC,MAAM,cAAc,CAAA;AAG/D,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,iHAAiH,CAClH;CACJ,CAAC,CAAA;AAIF,MAAM,WAAW,GAAG;;sTAEkS,CAAA;AAEtT,gGAAgG;AAChG,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAA;AAEnF,SAAS,WAAW,CAAC,SAA2B;IAC9C,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;AACnE,CAAC;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAsB;IACxD,IAAI,EAAE,uBAAuB;IAC7B,KAAK,EAAE,6BAA6B;IACpC,WAAW;IACX,UAAU,EAAE,WAAW,CAAC,KAAK;IAC7B,WAAW,EAAE,EAAC,YAAY,EAAE,IAAI,EAAC;IACjC,GAAG,CAAC,KAAK,EAAE,GAAG;QACZ,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,cAAc,CAAA;QACjD,
|
|
1
|
+
{"version":3,"file":"primer-brand-examples.js","sourceRoot":"","sources":["../../../src/tools/primer-brand-examples/primer-brand-examples.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAA;AAGrB,OAAO,EAAC,IAAI,EAAC,MAAM,oBAAoB,CAAA;AACvC,OAAO,EAAC,qBAAqB,EAAE,WAAW,EAAC,MAAM,cAAc,CAAA;AAG/D,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,iHAAiH,CAClH;CACJ,CAAC,CAAA;AAIF,MAAM,WAAW,GAAG;;sTAEkS,CAAA;AAEtT,gGAAgG;AAChG,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAA;AAEnF,SAAS,WAAW,CAAC,SAA2B;IAC9C,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;AACnE,CAAC;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAsB;IACxD,IAAI,EAAE,uBAAuB;IAC7B,KAAK,EAAE,6BAA6B;IACpC,WAAW;IACX,UAAU,EAAE,WAAW,CAAC,KAAK;IAC7B,WAAW,EAAE,EAAC,YAAY,EAAE,IAAI,EAAC;IACjC,GAAG,CAAC,KAAK,EAAE,GAAG;QACZ,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,cAAc,CAAA;QACjD,mFAAmF;QACnF,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAA;QACvF,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO;gBACL,IAAI,EAAE,sGAAsG,WAAW,CACrH,GAAG,CACJ,EAAE;gBACH,OAAO,EAAE,IAAI;aACd,CAAA;QACH,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,qBAAqB,CAAC;aAC5D,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;aACX,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC3B,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAA;QACvC,MAAM,UAAU,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAC/G,CAAC,SAAS,EAAiC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CACjE,CAAA;QACD,gFAAgF;QAChF,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;QAEpG,MAAM,IAAI,GAAG,UAAU;YACrB,CAAC,CAAC,uBAAuB,IAAI,iHAAiH;YAC9I,CAAC,CAAC,0CAA0C,IAAI,kEAAkE,CAAA;QAEpH,MAAM,iBAAiB,GAAG,KAAK;aAC5B,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,SAAS,CAAC,IAAI,gBAAgB,WAAW,CAAC,SAAS,CAAC,UAAU,CAAC;aACvF,IAAI,CAAC,MAAM,CAAC,CAAA;QAEf,6FAA6F;QAC7F,gGAAgG;QAChG,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAC7G,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CACpB,CAAA;QACD,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,CAAA;QAEnC,MAAM,QAAQ,GAAG,CAAC,mBAAmB,IAAI,GAAG,CAAC,CAAA;QAC7C,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,YAAY,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YAC5C,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM;gBAC9B,CAAC,CAAC,6CAA6C,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;gBACrG,CAAC,CAAC,EAAE,CAAA;YACN,QAAQ,CAAC,IAAI,CACX;gBACE,uCAAuC,SAAS,CAAC,KAAK,EAAE;gBACxD,ghBAAghB,IAAI,EAAE;gBACthB,cAAc,SAAS,CAAC,MAAM,UAAU;aACzC,CAAC,IAAI,CAAC,MAAM,CAAC,CACf,CAAA;QACH,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAA;QACxD,OAAO,EAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAC,CAAA;IACtC,CAAC;CACF,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@primer/brand-mcp",
|
|
3
|
-
"version": "0.72.0-rc.
|
|
3
|
+
"version": "0.72.0-rc.8a25c4ef",
|
|
4
4
|
"description": "MCP (Model Context Protocol) server that helps AI agents use Primer Brand (@primer/react-brand) correctly when building GitHub marketing and landing pages.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"primer",
|