@primer/brand-mcp 0.69.0 → 0.70.0-rc.9ef718be

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 (50) hide show
  1. package/README.md +10 -9
  2. package/content/page-design.md +76 -0
  3. package/dist/brand/detect-asset-generator.d.ts +6 -0
  4. package/dist/brand/detect-asset-generator.js +21 -0
  5. package/dist/brand/detect-asset-generator.js.map +1 -0
  6. package/dist/brand/detect-framework.d.ts +3 -4
  7. package/dist/brand/detect-framework.js +18 -21
  8. package/dist/brand/detect-framework.js.map +1 -1
  9. package/dist/brand/docs-source.d.ts +8 -20
  10. package/dist/brand/docs-source.js +38 -41
  11. package/dist/brand/docs-source.js.map +1 -1
  12. package/dist/brand/resolve-assets.d.ts +4 -5
  13. package/dist/brand/resolve-assets.js +60 -68
  14. package/dist/brand/resolve-assets.js.map +1 -1
  15. package/dist/brand/resolve-install.d.ts +2 -4
  16. package/dist/brand/resolve-install.js +10 -10
  17. package/dist/brand/resolve-install.js.map +1 -1
  18. package/dist/catalog/load.js +0 -1
  19. package/dist/catalog/load.js.map +1 -1
  20. package/dist/catalog/types.d.ts +24 -14
  21. package/dist/catalog/types.js +2 -2
  22. package/dist/catalog/types.js.map +1 -1
  23. package/dist/catalog.json +105 -2
  24. package/dist/logger.d.ts +2 -2
  25. package/dist/review/rules.js +27 -0
  26. package/dist/review/rules.js.map +1 -1
  27. package/dist/review/types.d.ts +4 -4
  28. package/dist/server.js +13 -2
  29. package/dist/server.js.map +1 -1
  30. package/dist/tools/primer-brand-asset/primer-brand-asset.js +12 -3
  31. package/dist/tools/primer-brand-asset/primer-brand-asset.js.map +1 -1
  32. package/dist/tools/primer-brand-examples/primer-brand-examples.js +23 -4
  33. package/dist/tools/primer-brand-examples/primer-brand-examples.js.map +1 -1
  34. package/dist/tools/primer-brand-page-design/index.d.ts +1 -0
  35. package/dist/tools/primer-brand-page-design/index.js +2 -0
  36. package/dist/tools/primer-brand-page-design/index.js.map +1 -0
  37. package/dist/tools/primer-brand-page-design/primer-brand-page-design.d.ts +6 -0
  38. package/dist/tools/primer-brand-page-design/primer-brand-page-design.js +19 -0
  39. package/dist/tools/primer-brand-page-design/primer-brand-page-design.js.map +1 -0
  40. package/dist/tools/primer-brand-review/primer-brand-review.js +23 -19
  41. package/dist/tools/primer-brand-review/primer-brand-review.js.map +1 -1
  42. package/dist/tools/primer-brand-setup/primer-brand-setup.js +1 -1
  43. package/dist/tools/primer-brand-setup/primer-brand-setup.js.map +1 -1
  44. package/dist/tools/primer-brand-tokens/primer-brand-tokens.js +38 -29
  45. package/dist/tools/primer-brand-tokens/primer-brand-tokens.js.map +1 -1
  46. package/dist/tools/register.js +3 -2
  47. package/dist/tools/register.js.map +1 -1
  48. package/dist/tools/types.d.ts +11 -12
  49. package/dist/util/text.d.ts +2 -2
  50. package/package.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"primer-brand-asset.js","sourceRoot":"","sources":["../../../src/tools/primer-brand-asset/primer-brand-asset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAA;AAErB,OAAO,EAAC,IAAI,EAAC,MAAM,oBAAoB,CAAA;AAGvC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qEAAqE,CAAC;IACjG,IAAI,EAAE,CAAC;SACJ,IAAI,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;SAC9B,QAAQ,EAAE;SACV,QAAQ,CAAC,gEAAgE,CAAC;IAC7E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;CACvF,CAAC,CAAA;AAIF,MAAM,WAAW,GAAG,yOAAyO,CAAA;AAE7P,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,IAAI,EAAE,oBAAoB;IAC1B,KAAK,EAAE,oCAAoC;IAC3C,WAAW;IACX,UAAU,EAAE,WAAW,CAAC,KAAK;IAC7B,WAAW,EAAE,EAAC,YAAY,EAAE,IAAI,EAAC;IACjC,GAAG,CAAC,KAAK,EAAE,GAAgB;QACzB,MAAM,MAAM,GACV,GAAG,CAAC,YAAY,KAAK,WAAW;YAC9B,CAAC,CAAC,8DAA8D;YAChE,CAAC,CAAC,oFAAoF,CAAA;QAE1F,IAAI,MAAM,GAAG,GAAG,CAAC,MAAM,CAAA;QACvB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,EAAC,IAAI,EAAE,8CAA8C,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAC,CAAA;QACtF,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAA;QAC5D,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACxF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO;gBACL,IAAI,EAAE,MAAM,KAAK,CAAC,IAAI,IAAI,OAAO,aAC/B,KAAK,CAAC,KACR,+DAA+D,MAAM,EAAE;aACxE,CAAA;QACH,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;QAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,6BAA6B,CAAC,CAAC,CAAC,EAAE,CAAA;QAClH,MAAM,KAAK,GAAG,KAAK;aAChB,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,IAAI,kBAAkB,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC,MAAM,KAAK,CAAC;aACzG,IAAI,CAAC,IAAI,CAAC,CAAA;QACb,OAAO,EAAC,IAAI,EAAE,GAAG,KAAK,GAAG,IAAI,OAAO,MAAM,EAAE,EAAC,CAAA;IAC/C,CAAC;CACF,CAAA"}
1
+ {"version":3,"file":"primer-brand-asset.js","sourceRoot":"","sources":["../../../src/tools/primer-brand-asset/primer-brand-asset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAA;AAErB,OAAO,EAAC,IAAI,EAAC,MAAM,oBAAoB,CAAA;AAGvC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qEAAqE,CAAC;IACjG,IAAI,EAAE,CAAC;SACJ,IAAI,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;SAC9B,QAAQ,EAAE;SACV,QAAQ,CAAC,gEAAgE,CAAC;IAC7E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;CACvF,CAAC,CAAA;AAIF,MAAM,WAAW,GAAG,yOAAyO,CAAA;AAE7P,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,IAAI,EAAE,oBAAoB;IAC1B,KAAK,EAAE,oCAAoC;IAC3C,WAAW;IACX,UAAU,EAAE,WAAW,CAAC,KAAK;IAC7B,WAAW,EAAE,EAAC,YAAY,EAAE,IAAI,EAAC;IACjC,GAAG,CAAC,KAAK,EAAE,GAAgB;QACzB,MAAM,MAAM,GACV,GAAG,CAAC,YAAY,KAAK,WAAW;YAC9B,CAAC,CAAC,8DAA8D;YAChE,CAAC,CAAC,oFAAoF,CAAA;QAE1F,IAAI,MAAM,GAAG,GAAG,CAAC,MAAM,CAAA;QACvB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,EAAC,IAAI,EAAE,8CAA8C,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAC,CAAA;QACtF,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAA;QAC5D,CAAC;QAED,MAAM,WAAW,GAAG,GAAG,CAAC,cAAc,CAAC,SAAS;YAC9C,CAAC,CAAC,mIAAmI;YACrI,CAAC,CAAC,EAAE,CAAA;QAEN,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACxF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO;gBACL,IAAI,EAAE;oBACJ,MAAM,KAAK,CAAC,IAAI,IAAI,OAAO,aAAa,KAAK,CAAC,KAAK,0DAA0D;oBAC7G,MAAM;oBACN,WAAW;iBACZ;qBACE,MAAM,CAAC,OAAO,CAAC;qBACf,IAAI,CAAC,MAAM,CAAC;aAChB,CAAA;QACH,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;QAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,6BAA6B,CAAC,CAAC,CAAC,EAAE,CAAA;QAClH,MAAM,KAAK,GAAG,KAAK;aAChB,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,IAAI,kBAAkB,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC,MAAM,KAAK,CAAC;aACzG,IAAI,CAAC,IAAI,CAAC,CAAA;QACb,OAAO,EAAC,IAAI,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAC,CAAA;IACtF,CAAC;CACF,CAAA"}
@@ -7,7 +7,9 @@ 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, taken from the component library's own tested Storybook stories — real compositions to adapt, not turnkey templates. Pass a goal like "pricing section" or "education landing page" for the closest matching examples; with no match you get a default foundational set, so it is never a dead end. Because they come verbatim from stories, examples may include Storybook scaffolding — \`{...args}\` spreads, \`args\`-driven props, and imported demo assets (images, avatars); treat those as placeholders to fill in with real props and content, not literal code to copy. Use it to start from approved patterns instead of hand-building.`;
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
+ 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.`;
11
13
  /** Foundational sections that anchor almost every GitHub landing page, in composition order. */
12
14
  const DEFAULT_COMPONENTS = ['Hero', 'SectionIntro', 'River', 'Pillar', 'CTABanner'];
13
15
  function exampleCode(component) {
@@ -38,11 +40,28 @@ export const primerBrandExamplesTool = {
38
40
  const shown = useDefault ? (defaultSet.length > 0 ? defaultSet : withExamples.slice(0, 5)) : matched;
39
41
  const note = useDefault
40
42
  ? `No example matched "${goal}", so here is the default foundational set — compose these in order and adapt the copy and props to your theme.`
41
- : `Closest tested examples for "${goal}". Adapt the copy and props to your theme; don't paste verbatim.`;
42
- const examples = shown
43
+ : `Closest tested component examples for "${goal}". Adapt the copy and props to your theme; don't paste verbatim.`;
44
+ const componentExamples = shown
43
45
  .map(component => `### ${component.name}\n\`\`\`tsx\n${exampleCode(component)}\n\`\`\``)
44
46
  .join('\n\n');
45
- return { text: [`# Examples for "${goal}"`, note, examples, versionNote(ctx)].join('\n\n') };
47
+ // For page-level goals, lead with the closest full-page recipe. It's the real source (single
48
+ // source of truth in @primer/react-brand), so tell the agent to look past its demo scaffolding.
49
+ const matchedRecipes = rank(goal, ctx.catalog.recipes, recipe => [recipe.title, recipe.keywords.join(' ')]).map(entry => entry.item);
50
+ const topRecipe = matchedRecipes[0];
51
+ const sections = [`# Examples for "${goal}"`];
52
+ if (topRecipe) {
53
+ const otherRecipes = matchedRecipes.slice(1);
54
+ const also = otherRecipes.length
55
+ ? ` Other full-page templates for this goal: ${otherRecipes.map(recipe => recipe.title).join(', ')}.`
56
+ : '';
57
+ sections.push([
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}`,
60
+ `\`\`\`tsx\n${topRecipe.source}\n\`\`\``,
61
+ ].join('\n\n'));
62
+ }
63
+ sections.push(note, componentExamples, versionNote(ctx));
64
+ return { text: sections.join('\n\n') };
46
65
  },
47
66
  };
48
67
  //# sourceMappingURL=primer-brand-examples.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"primer-brand-examples.js","sourceRoot":"","sources":["../../../src/tools/primer-brand-examples/primer-brand-examples.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"primer-brand-examples.js","sourceRoot":"","sources":["../../../src/tools/primer-brand-examples/primer-brand-examples.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from './primer-brand-page-design.js';
@@ -0,0 +1,2 @@
1
+ export * from './primer-brand-page-design.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/primer-brand-page-design/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAA"}
@@ -0,0 +1,6 @@
1
+ import { z } from 'zod';
2
+ import type { ToolModule } from '../types.js';
3
+ declare const inputSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
4
+ type Input = z.infer<typeof inputSchema>;
5
+ export declare const primerPageDesignTool: ToolModule<Input>;
6
+ export {};
@@ -0,0 +1,19 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { z } from 'zod';
4
+ import { versionNote } from '../format.js';
5
+ const inputSchema = z.object({});
6
+ const description = `Page-design patterns to read before building a page: how to structure and style a full marketing/landing page and use components together correctly (frame with \`SubdomainNavBar\` + \`MinimalFooter\`, give heroes media, group cards inside connected gridlines, keep labels auto-width, bias to the gridline aesthetic) plus the current-brand reference templates to start from. Learn individual component APIs with \`primer_brand_docs\` / \`primer_brand_component\` — this is the page-design layer above them. These conventions \`primer_brand_review\` does not enforce.`;
7
+ const guidancePath = fileURLToPath(new URL('../../../content/page-design.md', import.meta.url));
8
+ export const primerPageDesignTool = {
9
+ name: 'primer_brand_page_design',
10
+ title: 'Page design patterns',
11
+ description,
12
+ inputShape: inputSchema.shape,
13
+ annotations: { readOnlyHint: true },
14
+ run(_input, ctx) {
15
+ const guidance = readFileSync(guidancePath, 'utf8').trim();
16
+ return { text: `${guidance}\n\n${versionNote(ctx)}` };
17
+ },
18
+ };
19
+ //# sourceMappingURL=primer-brand-page-design.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"primer-brand-page-design.js","sourceRoot":"","sources":["../../../src/tools/primer-brand-page-design/primer-brand-page-design.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,SAAS,CAAA;AACpC,OAAO,EAAC,aAAa,EAAC,MAAM,UAAU,CAAA;AAEtC,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAA;AAErB,OAAO,EAAC,WAAW,EAAC,MAAM,cAAc,CAAA;AAGxC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;AAIhC,MAAM,WAAW,GAAG,ujBAAujB,CAAA;AAE3kB,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,iCAAiC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAE/F,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,IAAI,EAAE,0BAA0B;IAChC,KAAK,EAAE,sBAAsB;IAC7B,WAAW;IACX,UAAU,EAAE,WAAW,CAAC,KAAK;IAC7B,WAAW,EAAE,EAAC,YAAY,EAAE,IAAI,EAAC;IACjC,GAAG,CAAC,MAAM,EAAE,GAAgB;QAC1B,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAA;QAC1D,OAAO,EAAC,IAAI,EAAE,GAAG,QAAQ,OAAO,WAAW,CAAC,GAAG,CAAC,EAAE,EAAC,CAAA;IACrD,CAAC;CACF,CAAA"}
@@ -7,25 +7,12 @@ const inputSchema = z.object({
7
7
  .describe('Your COMPLETE output to check: the JSX/TSX AND all CSS/stylesheets together. Include App.css and any *.module.css — hardcoded px/hex usually live there.'),
8
8
  filename: z.string().optional().describe('Optional filename, used only to label the report.'),
9
9
  });
10
- const description = `The final on-brand gate. Before you finish, paste your COMPLETE output in one call — the JSX/TSX AND every stylesheet (App.css, *.module.css, styled blocks) together — because hardcoded sizes/colors and raw HTML most often hide in CSS. Flags non-compliant components or sub-components, invalid prop values, headings left at their oversized default (a \`Heading\` with no explicit \`size\`), raw HTML where a brand component exists, hardcoded colors/sizes that should be tokens, and off-brand visual tells (purple gradients, pill buttons, glassmorphism, placeholder copy). Run it on everything you wrote and fix what it reports rather than guessing.`;
11
- function formatFindings(label, findings) {
12
- if (findings.length === 0)
13
- return '';
14
- const lines = findings.map(finding => {
15
- const evidenceLine = finding.evidence ? `\n > \`${finding.evidence}\`` : '';
16
- return `- **${finding.rule}**: ${finding.message}${evidenceLine}`;
17
- });
18
- return `## ${label}\n${lines.join('\n')}`;
19
- }
20
- const hasJsx = (code) => /<[A-Za-z][A-Za-z0-9.]*[\s/>]/.test(code);
21
- // Clearly a stylesheet: a class/id/at-rule selector carrying CSS declarations (not a TS object/type).
22
- const hasStylesheet = (code) => /[.#][\w-]+[^{}]*\{[^{}]*:[^{}]*;/.test(code) || /@(?:media|font-face|keyframes|supports|import)\b/.test(code);
23
- /** Nudge agents to include their CSS — where most hardcoded px/hex and raw elements actually hide. */
24
- function cssGateReminder(code) {
25
- if (!hasJsx(code) || hasStylesheet(code))
26
- return '';
27
- return '> **Include your CSS.** This looks like JSX/TSX only. Hardcoded `px`/hex and raw elements most often live in a separate stylesheet — re-run `primer_brand_review` with the JSX **and** every stylesheet (`App.css`, `*.module.css`, styled blocks) together. This is the final gate over your COMPLETE output.';
28
- }
10
+ const description = `The final on-brand gate. Before you finish, paste your COMPLETE output in one call — the JSX/TSX AND
11
+ every stylesheet (App.css, *.module.css, styled blocks) together — because hardcoded sizes/colors and raw HTML most often
12
+ hide in CSS. Flags non-compliant components or sub-components, invalid prop values, headings left at their oversized default
13
+ (a \`Heading\` with no explicit \`size\`), raw HTML where a brand component exists, hardcoded colors/sizes that should be tokens,
14
+ and off-brand visual tells (purple gradients, pill buttons, glassmorphism, placeholder copy). Run it on everything you wrote and
15
+ fix what it reports rather than guessing.`;
29
16
  export const primerBrandReviewTool = {
30
17
  name: 'primer_brand_review',
31
18
  title: 'Review code against Primer Brand',
@@ -33,6 +20,23 @@ export const primerBrandReviewTool = {
33
20
  inputShape: inputSchema.shape,
34
21
  annotations: { readOnlyHint: true },
35
22
  run(input, ctx) {
23
+ const hasJsx = (code) => /<[A-Za-z][A-Za-z0-9.]*[\s/>]/.test(code);
24
+ const hasStylesheet = (code) => /[.#][\w-]+[^{}]*\{[^{}]*:[^{}]*;/.test(code) || /@(?:media|font-face|keyframes|supports|import)\b/.test(code);
25
+ /** Nudges agents to include their CSS - where most hardcoded px/hex and raw elements actually hide. */
26
+ const cssGateReminder = (code) => {
27
+ if (!hasJsx(code) || hasStylesheet(code))
28
+ return '';
29
+ return '> **Include your CSS.** This looks like JSX/TSX only. Hardcoded `px`/hex and raw elements most often live in a separate stylesheet — re-run `primer_brand_review` with the JSX **and** every stylesheet (`App.css`, `*.module.css`, styled blocks) together. This is the final gate over your COMPLETE output.';
30
+ };
31
+ const formatFindings = (label, findings) => {
32
+ if (findings.length === 0)
33
+ return '';
34
+ const lines = findings.map(finding => {
35
+ const evidenceLine = finding.evidence ? `\n > \`${finding.evidence}\`` : '';
36
+ return `- **${finding.rule}**: ${finding.message}${evidenceLine}`;
37
+ });
38
+ return `## ${label}\n${lines.join('\n')}`;
39
+ };
36
40
  const findings = allRules.flatMap(rule => rule.run(input.code, ctx.catalog));
37
41
  const errors = findings.filter(finding => finding.severity === 'error');
38
42
  const warnings = findings.filter(finding => finding.severity === 'warning');
@@ -1 +1 @@
1
- {"version":3,"file":"primer-brand-review.js","sourceRoot":"","sources":["../../../src/tools/primer-brand-review/primer-brand-review.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"primer-brand-review.js","sourceRoot":"","sources":["../../../src/tools/primer-brand-review/primer-brand-review.ts"],"names":[],"mappings":"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"}
@@ -107,7 +107,7 @@ function build(id, ctx) {
107
107
  `## 2. Root setup (the step agents usually skip)\n${fence}tsx\n${snippet}\n${fence}${rscNote}\n\n_Optional: set the theme with \`<ThemeProvider colorMode="light">\` — also accepts \`"dark"\` or \`"auto"\`._`,
108
108
  `## 3. Fonts\nPrimer Brand uses **Mona Sans / Hubot Sans**. The \`fonts.css\` import above loads them — pages without these fonts read as off-brand.`,
109
109
  `## 4. Styles\nImporting components from \`@primer/react-brand/esm\` auto-includes each component's styles. **Do not also import \`@primer/react-brand/lib/css/main.css\`** — that is the non-ESM path, and mixing the two double-loads styles.`,
110
- `## 5. Build the page\n- \`primer_brand_examples\` for a correct starting composition, then \`primer_brand_component\` for exact props\n- \`primer_brand_tokens\` / \`primer_brand_asset\` for colors, spacing, and icons\n- \`primer_brand_review\` on your complete output — JSX and CSS together — before you finish`,
110
+ `## 5. Build the page\n- \`primer_brand_page_design\` first for page-design patterns and the current-brand reference templates to start from\n- \`primer_brand_examples\` for a correct starting composition, then \`primer_brand_component\` for exact props\n- \`primer_brand_tokens\` / \`primer_brand_asset\` for colors, spacing, and icons\n- \`primer_brand_review\` on your complete output — JSX and CSS together — before you finish`,
111
111
  `## 6. Header & footer\nFor a global header use \`SubdomainNavBar\`; for the footer use \`MinimalFooter\`. Don't hand-roll a \`<header>\`, \`<nav>\`, or \`<footer>\` — call \`primer_brand_component\` with "SubdomainNavBar" or "MinimalFooter" for their APIs.`,
112
112
  versionNote(ctx),
113
113
  ].join('\n\n');
@@ -1 +1 @@
1
- {"version":3,"file":"primer-brand-setup.js","sourceRoot":"","sources":["../../../src/tools/primer-brand-setup/primer-brand-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAA;AAErB,OAAO,EAAC,eAAe,EAAmB,MAAM,iCAAiC,CAAA;AACjF,OAAO,EAAC,WAAW,EAAC,MAAM,cAAc,CAAA;AAGxC,MAAM,KAAK,GAAG,KAAK,CAAA;AAEnB,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,SAAS,EAAE,CAAC;SACT,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;SAClE,QAAQ,EAAE;SACV,OAAO,CAAC,MAAM,CAAC;SACf,QAAQ,CAAC,uFAAuF,CAAC;CACrG,CAAC,CAAA;AAIF,MAAM,WAAW,GAAG,sYAAsY,CAAA;AAE1Z,MAAM,MAAM,GAAuD;IACjE,UAAU,EAAE,EAAC,KAAK,EAAE,sBAAsB,EAAE,GAAG,EAAE,IAAI,EAAC;IACtD,YAAY,EAAE,EAAC,KAAK,EAAE,wBAAwB,EAAE,GAAG,EAAE,KAAK,EAAC;IAC3D,IAAI,EAAE,EAAC,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,KAAK,EAAC;IACzC,KAAK,EAAE,EAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAC;IACnC,KAAK,EAAE,EAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAC;IACnC,OAAO,EAAE,EAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,KAAK,EAAC;CAChD,CAAA;AAED,MAAM,aAAa,GAAoD;IACrE,UAAU,EAAE;;;;;;;;;;;;;;;;;;;;EAoBZ;IACA,YAAY,EAAE;;;;;;;;;;;EAWd;IACA,IAAI,EAAE;;;;;;;;;;;;;EAaN;IACA,KAAK,EAAE;;;;;;;;;;;EAWP;IACA,KAAK,EAAE;;;;;;;;yEAQgE;CACxE,CAAA;AAED,MAAM,eAAe,GAAG;;;;;;iBAMP,CAAA;AAEjB,SAAS,KAAK,CAAC,EAAe,EAAE,GAAgB;IAC9C,MAAM,EAAC,KAAK,EAAE,GAAG,EAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAA;IAC/B,MAAM,OAAO,GAAG,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;IAEtE,MAAM,OAAO,GAAG,GAAG;QACjB,CAAC,CAAC,+MAA+M;QACjN,CAAC,CAAC,EAAE,CAAA;IAEN,OAAO;QACL,2BAA2B,KAAK,EAAE;QAClC,kBAAkB,KAAK,0CAA0C,KAAK,EAAE;QACxE,oDAAoD,KAAK,QAAQ,OAAO,KAAK,KAAK,GAAG,OAAO,mHAAmH;QAC/M,qJAAqJ;QACrJ,gPAAgP;QAChP,wTAAwT;QACxT,kQAAkQ;QAClQ,WAAW,CAAC,GAAG,CAAC;KACjB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AAChB,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,IAAI,EAAE,oBAAoB;IAC1B,KAAK,EAAE,kCAAkC;IACzC,WAAW;IACX,UAAU,EAAE,WAAW,CAAC,KAAK;IAC7B,WAAW,EAAE,EAAC,YAAY,EAAE,IAAI,EAAC;IACjC,GAAG,CAAC,KAAK,EAAE,GAAG;QACZ,MAAM,EAAE,GAAgB,KAAK,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAA;QAC3F,OAAO,EAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,EAAC,CAAA;IAC/B,CAAC;CACF,CAAA"}
1
+ {"version":3,"file":"primer-brand-setup.js","sourceRoot":"","sources":["../../../src/tools/primer-brand-setup/primer-brand-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAA;AAErB,OAAO,EAAC,eAAe,EAAmB,MAAM,iCAAiC,CAAA;AACjF,OAAO,EAAC,WAAW,EAAC,MAAM,cAAc,CAAA;AAGxC,MAAM,KAAK,GAAG,KAAK,CAAA;AAEnB,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,SAAS,EAAE,CAAC;SACT,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;SAClE,QAAQ,EAAE;SACV,OAAO,CAAC,MAAM,CAAC;SACf,QAAQ,CAAC,uFAAuF,CAAC;CACrG,CAAC,CAAA;AAIF,MAAM,WAAW,GAAG,sYAAsY,CAAA;AAE1Z,MAAM,MAAM,GAAuD;IACjE,UAAU,EAAE,EAAC,KAAK,EAAE,sBAAsB,EAAE,GAAG,EAAE,IAAI,EAAC;IACtD,YAAY,EAAE,EAAC,KAAK,EAAE,wBAAwB,EAAE,GAAG,EAAE,KAAK,EAAC;IAC3D,IAAI,EAAE,EAAC,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,KAAK,EAAC;IACzC,KAAK,EAAE,EAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAC;IACnC,KAAK,EAAE,EAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAC;IACnC,OAAO,EAAE,EAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,KAAK,EAAC;CAChD,CAAA;AAED,MAAM,aAAa,GAAoD;IACrE,UAAU,EAAE;;;;;;;;;;;;;;;;;;;;EAoBZ;IACA,YAAY,EAAE;;;;;;;;;;;EAWd;IACA,IAAI,EAAE;;;;;;;;;;;;;EAaN;IACA,KAAK,EAAE;;;;;;;;;;;EAWP;IACA,KAAK,EAAE;;;;;;;;yEAQgE;CACxE,CAAA;AAED,MAAM,eAAe,GAAG;;;;;;iBAMP,CAAA;AAEjB,SAAS,KAAK,CAAC,EAAe,EAAE,GAAgB;IAC9C,MAAM,EAAC,KAAK,EAAE,GAAG,EAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAA;IAC/B,MAAM,OAAO,GAAG,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;IAEtE,MAAM,OAAO,GAAG,GAAG;QACjB,CAAC,CAAC,+MAA+M;QACjN,CAAC,CAAC,EAAE,CAAA;IAEN,OAAO;QACL,2BAA2B,KAAK,EAAE;QAClC,kBAAkB,KAAK,0CAA0C,KAAK,EAAE;QACxE,oDAAoD,KAAK,QAAQ,OAAO,KAAK,KAAK,GAAG,OAAO,mHAAmH;QAC/M,qJAAqJ;QACrJ,gPAAgP;QAChP,+aAA+a;QAC/a,kQAAkQ;QAClQ,WAAW,CAAC,GAAG,CAAC;KACjB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AAChB,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,IAAI,EAAE,oBAAoB;IAC1B,KAAK,EAAE,kCAAkC;IACzC,WAAW;IACX,UAAU,EAAE,WAAW,CAAC,KAAK;IAC7B,WAAW,EAAE,EAAC,YAAY,EAAE,IAAI,EAAC;IACjC,GAAG,CAAC,KAAK,EAAE,GAAG;QACZ,MAAM,EAAE,GAAgB,KAAK,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAA;QAC3F,OAAO,EAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,EAAC,CAAA;IAC/B,CAAC;CACF,CAAA"}
@@ -6,54 +6,52 @@ const inputSchema = z.object({
6
6
  .string()
7
7
  .optional()
8
8
  .default('')
9
- .describe('What you need, e.g. "accent background", "danger text", "spacing", "border width", "border radius". Spacing maps to the size/spacing scale; "border" surfaces border-width and border-color tokens.'),
9
+ .describe('What you need, e.g. "accent background", "danger text", "spacing", "border width", "border radius". Color words map to brand roles (red->danger, green->success, gray->neutral, background->canvas); spacing and dimensional width map to the size scale; "border" surfaces border-width and border-color tokens.'),
10
10
  group: z
11
11
  .string()
12
12
  .optional()
13
- .describe('Filter by token category, matched against token names: e.g. "color", "size", "spacing", "border", "shadow", "radius", "font". Combine with query to narrow.'),
13
+ .describe('Filter by token category, matched against token names: e.g. "color", "canvas", "size", "spacing", "border", "radius", "font". Combine with query to narrow.'),
14
14
  limit: z.number().int().min(1).max(50).optional().default(15).describe('Max results.'),
15
15
  });
16
- const description = `Resolve Primer Brand design tokens to CSS variables and values. Searches by intent — mapping color words to GitHub semantics (blue->accent, red->danger, green->success, yellow->attention) and spacing words to the size/spacing scale — and \`group\` filters by category (e.g. "color", "size", "border", "shadow"). Use these CSS variables instead of hardcoded hex/px so pages adapt across light and dark themes.`;
16
+ const description = `Resolve Primer Brand design tokens to CSS variables and values, searching by intent. Use these CSS variables instead of hardcoded hex/px so pages adapt across light and dark themes.`;
17
17
  /**
18
- * Map human words to the vocabulary that actually appears in Primer token names, so intent-based
19
- * queries and the `group` facet resolve to real tokens. Spacing is expressed with size/spacing
20
- * tokens, and the GitHub functional palette renames the usual colour words.
18
+ * Maps colloquial words to the vocabulary that actually appears in Primer Brand token names, so
19
+ * intent-based queries and the `group` facet resolve to real tokens. Only genuine translations
20
+ * belong here: words that already appear in token names (e.g. "weight", "lineHeight", "easing",
21
+ * "gap", "padding") match literally and need no entry.
22
+ *
23
+ * Brand functional color roles are: accent (green), danger, success, neutral, canvas (backgrounds),
24
+ * text (foreground), border, focus. There is intentionally NO `attention` or `severe` role — those
25
+ * are Primer *product* (@primer/react) roles, not brand, so never map to them.
21
26
  */
22
- const TOKEN_SYNONYMS = {
27
+ const semanticTokenMap = {
28
+ // Color intent -> brand functional roles. (Brand accent is green; "blue" routes product-minded
29
+ // queries to the primary accent, and still matches the base blue scale literally.)
23
30
  blue: ['accent'],
24
31
  red: ['danger'],
25
32
  green: ['success'],
26
- yellow: ['attention'],
27
- orange: ['severe'],
28
33
  gray: ['neutral'],
29
34
  grey: ['neutral'],
35
+ colour: ['color'],
36
+ background: ['canvas'],
37
+ bg: ['canvas'],
38
+ foreground: ['text'],
39
+ fg: ['text'],
40
+ // Spacing / dimensions -> the base size scale (--base-size-*) and brand spacing tokens. "width"
41
+ // is ambiguous (border width vs. dimensional width), so it surfaces both families.
30
42
  space: ['spacing', 'size'],
31
43
  spacing: ['spacing', 'size'],
32
44
  gap: ['gap', 'spacing', 'size'],
33
45
  padding: ['padding', 'spacing', 'size'],
34
- margin: ['margin', 'spacing', 'size'],
46
+ margin: ['spacing', 'size'],
35
47
  size: ['size'],
36
- // "border" alone otherwise ranks border-COLOR tokens above the border-WIDTH family (the 1px/2px
37
- // primitives agents actually need); boosting borderWidth surfaces them alongside the colors.
48
+ width: ['borderWidth', 'size'],
38
49
  border: ['borderWidth'],
39
- width: ['borderWidth'],
40
50
  radius: ['radius'],
41
51
  rounded: ['radius'],
42
52
  font: ['font'],
43
53
  typography: ['font', 'lineHeight'],
44
54
  };
45
- /** A category term plus its synonyms, lower-cased — what token names and groups are matched against. */
46
- function categoryNeedles(term) {
47
- const lower = term.trim().toLowerCase();
48
- return [lower, ...(TOKEN_SYNONYMS[lower] ?? [])];
49
- }
50
- function expandQuery(query) {
51
- const extra = query
52
- .toLowerCase()
53
- .split(/\s+/)
54
- .flatMap(word => TOKEN_SYNONYMS[word] ?? []);
55
- return [query, ...extra].join(' ');
56
- }
57
55
  export const primerBrandTokensTool = {
58
56
  name: 'primer_brand_tokens',
59
57
  title: 'Primer Brand design tokens',
@@ -61,18 +59,29 @@ export const primerBrandTokensTool = {
61
59
  inputShape: inputSchema.shape,
62
60
  annotations: { readOnlyHint: true },
63
61
  run(input, ctx) {
62
+ const expandQuery = (query) => {
63
+ const extra = query
64
+ .toLowerCase()
65
+ .split(/\s+/)
66
+ .flatMap(word => semanticTokenMap[word] ?? []);
67
+ return [query, ...extra].join(' ');
68
+ };
69
+ const categorySearchTerms = (term) => {
70
+ const lower = term.trim().toLowerCase();
71
+ return [lower, ...(semanticTokenMap[lower] ?? [])];
72
+ };
64
73
  let tokens = ctx.catalog.tokens;
65
74
  if (tokens.length === 0) {
66
75
  return {
67
- text: `Token data is not available. Ensure \`@primer/brand-primitives\` is installed/built.\n\n${versionNote(ctx)}`,
76
+ text: `Token data is not available. Check that \`@primer/brand-primitives\` is installed/built.\n\n${versionNote(ctx)}`,
68
77
  isError: true,
69
78
  };
70
79
  }
71
80
  if (input.group) {
72
- const needles = categoryNeedles(input.group);
81
+ const searchTerms = categorySearchTerms(input.group);
73
82
  tokens = tokens.filter(token => {
74
- const haystack = `${token.name} ${token.group}`.toLowerCase();
75
- return needles.some(needle => haystack.includes(needle));
83
+ const tokenText = `${token.name} ${token.group}`.toLowerCase();
84
+ return searchTerms.some(searchTerm => tokenText.includes(searchTerm));
76
85
  });
77
86
  }
78
87
  const query = input.query.trim();
@@ -1 +1 @@
1
- {"version":3,"file":"primer-brand-tokens.js","sourceRoot":"","sources":["../../../src/tools/primer-brand-tokens/primer-brand-tokens.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"primer-brand-tokens.js","sourceRoot":"","sources":["../../../src/tools/primer-brand-tokens/primer-brand-tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAA;AAErB,OAAO,EAAC,IAAI,EAAC,MAAM,oBAAoB,CAAA;AACvC,OAAO,EAAC,WAAW,EAAC,MAAM,cAAc,CAAA;AAGxC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CACP,mTAAmT,CACpT;IACH,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,6JAA6J,CAC9J;IACH,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;CACvF,CAAC,CAAA;AAIF,MAAM,WAAW,GAAG,uLAAuL,CAAA;AAE3M;;;;;;;;;GASG;AACH,MAAM,gBAAgB,GAA6B;IACjD,+FAA+F;IAC/F,mFAAmF;IACnF,IAAI,EAAE,CAAC,QAAQ,CAAC;IAChB,GAAG,EAAE,CAAC,QAAQ,CAAC;IACf,KAAK,EAAE,CAAC,SAAS,CAAC;IAClB,IAAI,EAAE,CAAC,SAAS,CAAC;IACjB,IAAI,EAAE,CAAC,SAAS,CAAC;IACjB,MAAM,EAAE,CAAC,OAAO,CAAC;IACjB,UAAU,EAAE,CAAC,QAAQ,CAAC;IACtB,EAAE,EAAE,CAAC,QAAQ,CAAC;IACd,UAAU,EAAE,CAAC,MAAM,CAAC;IACpB,EAAE,EAAE,CAAC,MAAM,CAAC;IACZ,gGAAgG;IAChG,mFAAmF;IACnF,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC;IAC5B,GAAG,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC;IAC/B,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC;IACvC,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,aAAa,EAAE,MAAM,CAAC;IAC9B,MAAM,EAAE,CAAC,aAAa,CAAC;IACvB,MAAM,EAAE,CAAC,QAAQ,CAAC;IAClB,OAAO,EAAE,CAAC,QAAQ,CAAC;IACnB,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,UAAU,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC;CACnC,CAAA;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAsB;IACtD,IAAI,EAAE,qBAAqB;IAC3B,KAAK,EAAE,4BAA4B;IACnC,WAAW;IACX,UAAU,EAAE,WAAW,CAAC,KAAK;IAC7B,WAAW,EAAE,EAAC,YAAY,EAAE,IAAI,EAAC;IACjC,GAAG,CAAC,KAAK,EAAE,GAAgB;QACzB,MAAM,WAAW,GAAG,CAAC,KAAa,EAAU,EAAE;YAC5C,MAAM,KAAK,GAAG,KAAK;iBAChB,WAAW,EAAE;iBACb,KAAK,CAAC,KAAK,CAAC;iBACZ,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;YAChD,OAAO,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACpC,CAAC,CAAA;QAED,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAY,EAAE;YACrD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;YACvC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QACpD,CAAC,CAAA;QAED,IAAI,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAA;QAC/B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO;gBACL,IAAI,EAAE,+FAA+F,WAAW,CAC9G,GAAG,CACJ,EAAE;gBACH,OAAO,EAAE,IAAI;aACd,CAAA;QACH,CAAC;QAED,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,WAAW,GAAG,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YACpD,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;gBAC7B,MAAM,SAAS,GAAG,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,CAAA;gBAC9D,OAAO,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAA;YACvE,CAAC,CAAC,CAAA;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;QAChC,MAAM,MAAM,GAAG,KAAK;YAClB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;YAC5G,CAAC,CAAC,MAAM,CAAA;QAEV,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO;gBACL,IAAI,EAAE,sBAAsB,KAAK,IAC/B,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAClD,8DAA8D,WAAW,CAAC,GAAG,CAAC,EAAE;aACjF,CAAA;QACH,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;QAC1C,MAAM,IAAI,GACR,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,yCAAyC,CAAC,CAAC,CAAC,EAAE,CAAA;QACnH,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC,KAAK,QAAQ,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC/G,OAAO,EAAC,IAAI,EAAE,GAAG,KAAK,GAAG,IAAI,OAAO,WAAW,CAAC,GAAG,CAAC,EAAE,EAAC,CAAA;IACzD,CAAC;CACF,CAAA"}
@@ -2,12 +2,12 @@ import { primerBrandAssetTool } from './primer-brand-asset/index.js';
2
2
  import { primerBrandComponentTool } from './primer-brand-component/index.js';
3
3
  import { primerBrandDocsTool } from './primer-brand-docs/index.js';
4
4
  import { primerBrandExamplesTool } from './primer-brand-examples/index.js';
5
+ import { primerPageDesignTool } from './primer-brand-page-design/index.js';
5
6
  import { primerBrandReviewTool } from './primer-brand-review/index.js';
6
7
  import { primerBrandTokensTool } from './primer-brand-tokens/index.js';
7
8
  import { primerBrandSetupTool } from './primer-brand-setup/index.js';
8
9
  /**
9
- * Register a single tool, preserving its input type end to end. The SDK validates `args`
10
- * against the tool's zod shape before calling the handler, so the cast is safe.
10
+ * Register a single tool
11
11
  */
12
12
  function add(server, tool, ctx) {
13
13
  server.registerTool(tool.name, {
@@ -35,6 +35,7 @@ function add(server, tool, ctx) {
35
35
  }
36
36
  export function registerTools(server, ctx) {
37
37
  add(server, primerBrandSetupTool, ctx);
38
+ add(server, primerPageDesignTool, ctx);
38
39
  add(server, primerBrandComponentTool, ctx);
39
40
  add(server, primerBrandExamplesTool, ctx);
40
41
  add(server, primerBrandTokensTool, ctx);
@@ -1 +1 @@
1
- {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/tools/register.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,oBAAoB,EAAC,MAAM,+BAA+B,CAAA;AAClE,OAAO,EAAC,wBAAwB,EAAC,MAAM,mCAAmC,CAAA;AAC1E,OAAO,EAAC,mBAAmB,EAAC,MAAM,8BAA8B,CAAA;AAChE,OAAO,EAAC,uBAAuB,EAAC,MAAM,kCAAkC,CAAA;AACxE,OAAO,EAAC,qBAAqB,EAAC,MAAM,gCAAgC,CAAA;AACpE,OAAO,EAAC,qBAAqB,EAAC,MAAM,gCAAgC,CAAA;AACpE,OAAO,EAAC,oBAAoB,EAAC,MAAM,+BAA+B,CAAA;AAGlE;;;GAGG;AACH,SAAS,GAAG,CAAQ,MAAiB,EAAE,IAAuB,EAAE,GAAgB;IAC9E,MAAM,CAAC,YAAY,CACjB,IAAI,CAAC,IAAI,EACT;QACE,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,IAAI,CAAC,UAAU;QAC5B,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,EACD,KAAK,EAAE,IAAa,EAAE,EAAE;QACtB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAa,EAAE,GAAG,CAAC,CAAA;YACjD,OAAO;gBACL,OAAO,EAAE,CAAC,EAAC,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAC,CAAC;gBACrD,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,KAAK;aACjC,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACtE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,IAAI,YAAY,OAAO,EAAE,CAAC,CAAA;YACxD,OAAO;gBACL,OAAO,EAAE,CAAC,EAAC,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,IAAI,CAAC,IAAI,iBAAiB,OAAO,EAAE,EAAC,CAAC;gBACpF,OAAO,EAAE,IAAI;aACd,CAAA;QACH,CAAC;IACH,CAAC,CACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAiB,EAAE,GAAgB;IAC/D,GAAG,CAAC,MAAM,EAAE,oBAAoB,EAAE,GAAG,CAAC,CAAA;IACtC,GAAG,CAAC,MAAM,EAAE,wBAAwB,EAAE,GAAG,CAAC,CAAA;IAC1C,GAAG,CAAC,MAAM,EAAE,uBAAuB,EAAE,GAAG,CAAC,CAAA;IACzC,GAAG,CAAC,MAAM,EAAE,qBAAqB,EAAE,GAAG,CAAC,CAAA;IACvC,GAAG,CAAC,MAAM,EAAE,oBAAoB,EAAE,GAAG,CAAC,CAAA;IACtC,GAAG,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,CAAC,CAAA;IACrC,GAAG,CAAC,MAAM,EAAE,qBAAqB,EAAE,GAAG,CAAC,CAAA;AACzC,CAAC"}
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/tools/register.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,oBAAoB,EAAC,MAAM,+BAA+B,CAAA;AAClE,OAAO,EAAC,wBAAwB,EAAC,MAAM,mCAAmC,CAAA;AAC1E,OAAO,EAAC,mBAAmB,EAAC,MAAM,8BAA8B,CAAA;AAChE,OAAO,EAAC,uBAAuB,EAAC,MAAM,kCAAkC,CAAA;AACxE,OAAO,EAAC,oBAAoB,EAAC,MAAM,qCAAqC,CAAA;AACxE,OAAO,EAAC,qBAAqB,EAAC,MAAM,gCAAgC,CAAA;AACpE,OAAO,EAAC,qBAAqB,EAAC,MAAM,gCAAgC,CAAA;AACpE,OAAO,EAAC,oBAAoB,EAAC,MAAM,+BAA+B,CAAA;AAGlE;;GAEG;AACH,SAAS,GAAG,CAAQ,MAAiB,EAAE,IAAuB,EAAE,GAAgB;IAC9E,MAAM,CAAC,YAAY,CACjB,IAAI,CAAC,IAAI,EACT;QACE,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,IAAI,CAAC,UAAU;QAC5B,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,EACD,KAAK,EAAE,IAAa,EAAE,EAAE;QACtB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAa,EAAE,GAAG,CAAC,CAAA;YACjD,OAAO;gBACL,OAAO,EAAE,CAAC,EAAC,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAC,CAAC;gBACrD,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,KAAK;aACjC,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACtE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,IAAI,YAAY,OAAO,EAAE,CAAC,CAAA;YACxD,OAAO;gBACL,OAAO,EAAE,CAAC,EAAC,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,IAAI,CAAC,IAAI,iBAAiB,OAAO,EAAE,EAAC,CAAC;gBACpF,OAAO,EAAE,IAAI;aACd,CAAA;QACH,CAAC;IACH,CAAC,CACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAiB,EAAE,GAAgB;IAC/D,GAAG,CAAC,MAAM,EAAE,oBAAoB,EAAE,GAAG,CAAC,CAAA;IACtC,GAAG,CAAC,MAAM,EAAE,oBAAoB,EAAE,GAAG,CAAC,CAAA;IACtC,GAAG,CAAC,MAAM,EAAE,wBAAwB,EAAE,GAAG,CAAC,CAAA;IAC1C,GAAG,CAAC,MAAM,EAAE,uBAAuB,EAAE,GAAG,CAAC,CAAA;IACzC,GAAG,CAAC,MAAM,EAAE,qBAAqB,EAAE,GAAG,CAAC,CAAA;IACvC,GAAG,CAAC,MAAM,EAAE,oBAAoB,EAAE,GAAG,CAAC,CAAA;IACtC,GAAG,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,CAAC,CAAA;IACrC,GAAG,CAAC,MAAM,EAAE,qBAAqB,EAAE,GAAG,CAAC,CAAA;AACzC,CAAC"}
@@ -4,7 +4,7 @@ import type { DocsSource } from '../brand/docs-source.js';
4
4
  import type { Catalog, CatalogAsset } from '../catalog/types.js';
5
5
  import type { Logger } from '../logger.js';
6
6
  /** Dependencies shared by every tool, assembled once when the server starts. */
7
- export interface ToolContext {
7
+ export type ToolContext = {
8
8
  catalog: Catalog;
9
9
  brand: BrandInstall;
10
10
  docs: DocsSource;
@@ -12,23 +12,22 @@ export interface ToolContext {
12
12
  /** Icons + illustrations, preferring the consumer's installed packages over the baked snapshot. */
13
13
  assets: CatalogAsset[];
14
14
  assetsOrigin: 'installed' | 'snapshot';
15
- }
16
- export interface ToolResult {
15
+ assetGenerator: {
16
+ available: boolean;
17
+ };
18
+ };
19
+ export type ToolResult = {
17
20
  text: string;
18
21
  isError?: boolean;
19
- }
20
- export interface ToolAnnotations {
22
+ };
23
+ export type ToolAnnotations = {
21
24
  readOnlyHint?: boolean;
22
- }
23
- /**
24
- * A self-contained tool. `run` holds the testable logic and is independent of the MCP
25
- * transport; the server wires it up via `registerTool`.
26
- */
27
- export interface ToolModule<Input = unknown> {
25
+ };
26
+ export type ToolModule<Input = unknown> = {
28
27
  name: string;
29
28
  title: string;
30
29
  description: string;
31
30
  inputShape: ZodRawShape;
32
31
  annotations: ToolAnnotations;
33
32
  run(input: Input, ctx: ToolContext): Promise<ToolResult> | ToolResult;
34
- }
33
+ };
@@ -1,8 +1,8 @@
1
1
  /** Small text utilities shared across tools: escaping and keyword relevance scoring. */
2
2
  export declare function escapeRegExp(input: string): string;
3
- export interface Ranked<T> {
3
+ export type Ranked<T> = {
4
4
  item: T;
5
5
  score: number;
6
- }
6
+ };
7
7
  /** Rank items by their best matching field score, keeping only positive matches. */
8
8
  export declare function rank<T>(query: string, items: T[], fields: (item: T) => Array<string | undefined>): Array<Ranked<T>>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@primer/brand-mcp",
3
- "version": "0.69.0",
3
+ "version": "0.70.0-rc.9ef718be",
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",
@@ -34,6 +34,7 @@
34
34
  },
35
35
  "files": [
36
36
  "dist",
37
+ "content",
37
38
  "README.md"
38
39
  ],
39
40
  "scripts": {