Repository files navigation

Protocol UI

AI-generated components that follow your rules.

ReScriptTypeScriptReactAI

The Problem

Most AI code generation is unreliable. You get components with missing accessibility, broken patterns, and inconsistent styling. Each generation is a roll of the dice. We can do better.

The Solution

Instead of hoping AI understands your requirements, encode them as rules that cannot be violated. Generate components that always follow your patterns, use your design system, and include proper testing hooks.

// Your rules, enforced automaticallyletvalidateComponent= (code: string) => {
// ✅ Must use design system functions// ✅ Must include test selectors // ✅ Must have accessibility attributes// ❌ Cannot use direct CSS classes
}

What You Get

  • Reliable generation - Components that follow your coding standards every time
  • Design system integration - No more className="bg-blue-500", uses your design tokens
  • Built-in testing - Every component includes test selectors and accessibility attributes
  • ReScript/React focused - Type-safe components that compile correctly

Quick Start

git clone https://github.com/hew/protocol-ui
cd protocol-ui
npm install
# Add your OpenAI API key to .envecho"OPENAI_API_KEY=your-key-here"> .env
# Generate a component
npm run generate:component

The CLI will prompt you for what you want to build:

? Describe the component: A button with primary and secondary variants
? Component name: ActionButton ? Interactive features? Yes
✅ Generated ActionButton.res

📖 Example Output

Input Prompt

"A card component with title, content, and optional action button"

Generated ReScript Component

// InfoCard.resopenReactopenDesignSystemtypeprops= {
title: string,
content: string,
actionText?: string,
onAction?: unit=>unit,
}
// Test selectors for Playwrightletselectors= {
root: "[data-test-id='InfoCard']",
title: "[data-test-id='InfoCard-title']",
action: "[data-test-id='InfoCard-action']",
}
@react.componentletmake= (~title, ~content, ~actionText=?, ~onAction=?) => {
<divdata-test-id="InfoCard"className={cx([
"p-6", "border", "rounded-lg", "shadow-sm",
backgroundColorToClass(Surface)
])}>
<h3data-test-id="InfoCard-title"className={cx([
"text-lg", "font-semibold", "mb-2",
colorToClass(OnSurface)
])}>
{title->React.string}
</h3>
<pclassName={cx([
"text-base", "mb-4",
colorToClass(OnSurfaceVariant)
])}>
{content->React.string}
</p>
{switch (actionText, onAction) {
| (Some(text), Some(handler)) =>
<buttondata-test-id="InfoCard-action"className={cx([
"px-4",
"py-2", "rounded",
backgroundColorToClass(Primary),
colorToClass(OnPrimary)
])}
onClick={_=>handler()}
aria-label={`Action: ${text}`}>
{text->React.string}
</button>
| _=>React.null
}}
</div>
}

How It Works

Input → AI Generation → Validation → ReScript Component

The system generates ReScript code, then validates it against your rules before saving. If validation fails, it tries again until it gets it right.

Core Files

  • src/ai-generator/ReScriptGenerator.res - AI generation logic
  • scripts/theme.js - Automated color theming system
  • src/core/DesignSystem.res - Design system integration

Validation Rules

Generated components must follow these patterns:

Required:

  • Test IDs: data-test-id="ComponentName"
  • Design system: backgroundColorToClass(Primary) instead of bg-blue-500
  • Accessibility: ARIA labels on interactive elements
  • ReScript types: Proper type annotations

Forbidden:

  • Direct CSS classes: className="bg-blue-500"
  • Missing test hooks
  • Poor accessibility

Design System Integration

Uses your design tokens instead of hardcoded values:

// ✅ Generated code uses design systemclassName={backgroundColorToClass(Primary)}
className={cx([colorToClass(OnSurface), "text-lg"])}
// ❌ Never generates direct classes className="bg-blue-500 text-white"// Validation prevents this

Change your theme with one command:

node scripts/theme.js "#1f2937" corporate

Testing Integration

Every generated component includes test selectors:

// Auto-generated in every componentletselectors= {
root: "[data-test-id='MyComponent']",
button: "[data-test-id='MyComponent-button']",
}

Use them in your tests:

// MyComponent.test.resopenPlaywrightlettestComponentClick=async () => {
letpage=awaitPage.create()
awaitPage.click(page, MyComponent.selectors.button)
awaitExpect.toBeVisible(Page.locator(page, MyComponent.selectors.root))
}

Configuration

Set your OpenAI API key:

echo"OPENAI_API_KEY=your-key-here"> .env

Development

npm run dev # Start dev server
rescript -w # Watch ReScript files
npm run generate:component # Generate a component

License

MIT License - see LICENSE file for details.

About

AI-generated components that follow your rules.

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Protocol UI

AI-generated components that follow your rules.

ReScriptTypeScriptReactAI

The Problem

Most AI code generation is unreliable. You get components with missing accessibility, broken patterns, and inconsistent styling. Each generation is a roll of the dice. We can do better.

The Solution

Instead of hoping AI understands your requirements, encode them as rules that cannot be violated. Generate components that always follow your patterns, use your design system, and include proper testing hooks.

// Your rules, enforced automaticallyletvalidateComponent= (code: string) => {
// ✅ Must use design system functions// ✅ Must include test selectors // ✅ Must have accessibility attributes// ❌ Cannot use direct CSS classes
}

What You Get

  • Reliable generation - Components that follow your coding standards every time
  • Design system integration - No more className="bg-blue-500", uses your design tokens
  • Built-in testing - Every component includes test selectors and accessibility attributes
  • ReScript/React focused - Type-safe components that compile correctly

Quick Start

git clone https://github.com/hew/protocol-ui
cd protocol-ui
npm install
# Add your OpenAI API key to .envecho"OPENAI_API_KEY=your-key-here"> .env
# Generate a component
npm run generate:component

The CLI will prompt you for what you want to build:

? Describe the component: A button with primary and secondary variants
? Component name: ActionButton ? Interactive features? Yes
✅ Generated ActionButton.res

📖 Example Output

Input Prompt

"A card component with title, content, and optional action button"

Generated ReScript Component

// InfoCard.resopenReactopenDesignSystemtypeprops= {
title: string,
content: string,
actionText?: string,
onAction?: unit=>unit,
}
// Test selectors for Playwrightletselectors= {
root: "[data-test-id='InfoCard']",
title: "[data-test-id='InfoCard-title']",
action: "[data-test-id='InfoCard-action']",
}
@react.componentletmake= (~title, ~content, ~actionText=?, ~onAction=?) => {
<divdata-test-id="InfoCard"className={cx([
"p-6", "border", "rounded-lg", "shadow-sm",
backgroundColorToClass(Surface)
])}>
<h3data-test-id="InfoCard-title"className={cx([
"text-lg", "font-semibold", "mb-2",
colorToClass(OnSurface)
])}>
{title->React.string}
</h3>
<pclassName={cx([
"text-base", "mb-4",
colorToClass(OnSurfaceVariant)
])}>
{content->React.string}
</p>
{switch (actionText, onAction) {
| (Some(text), Some(handler)) =>
<buttondata-test-id="InfoCard-action"className={cx([
"px-4",
"py-2", "rounded",
backgroundColorToClass(Primary),
colorToClass(OnPrimary)
])}
onClick={_=>handler()}
aria-label={`Action: ${text}`}>
{text->React.string}
</button>
| _=>React.null
}}
</div>
}

How It Works

Input → AI Generation → Validation → ReScript Component

The system generates ReScript code, then validates it against your rules before saving. If validation fails, it tries again until it gets it right.

Core Files

  • src/ai-generator/ReScriptGenerator.res - AI generation logic
  • scripts/theme.js - Automated color theming system
  • src/core/DesignSystem.res - Design system integration

Validation Rules

Generated components must follow these patterns:

Required:

  • Test IDs: data-test-id="ComponentName"
  • Design system: backgroundColorToClass(Primary) instead of bg-blue-500
  • Accessibility: ARIA labels on interactive elements
  • ReScript types: Proper type annotations

Forbidden:

  • Direct CSS classes: className="bg-blue-500"
  • Missing test hooks
  • Poor accessibility

Design System Integration

Uses your design tokens instead of hardcoded values:

// ✅ Generated code uses design systemclassName={backgroundColorToClass(Primary)}
className={cx([colorToClass(OnSurface), "text-lg"])}
// ❌ Never generates direct classes className="bg-blue-500 text-white"// Validation prevents this

Change your theme with one command:

node scripts/theme.js "#1f2937" corporate

Testing Integration

Every generated component includes test selectors:

// Auto-generated in every componentletselectors= {
root: "[data-test-id='MyComponent']",
button: "[data-test-id='MyComponent-button']",
}

Use them in your tests:

// MyComponent.test.resopenPlaywrightlettestComponentClick=async () => {
letpage=awaitPage.create()
awaitPage.click(page, MyComponent.selectors.button)
awaitExpect.toBeVisible(Page.locator(page, MyComponent.selectors.root))
}

Configuration

Set your OpenAI API key:

echo"OPENAI_API_KEY=your-key-here"> .env

Development

npm run dev # Start dev server
rescript -w # Watch ReScript files
npm run generate:component # Generate a component

License

MIT License - see LICENSE file for details.

About

AI-generated components that follow your rules.

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Protocol UI

AI-generated components that follow your rules.

ReScriptTypeScriptReactAI

The Problem

Most AI code generation is unreliable. You get components with missing accessibility, broken patterns, and inconsistent styling. Each generation is a roll of the dice. We can do better.

The Solution

Instead of hoping AI understands your requirements, encode them as rules that cannot be violated. Generate components that always follow your patterns, use your design system, and include proper testing hooks.

// Your rules, enforced automaticallyletvalidateComponent= (code: string) => {
// ✅ Must use design system functions// ✅ Must include test selectors // ✅ Must have accessibility attributes// ❌ Cannot use direct CSS classes
}

What You Get

  • Reliable generation - Components that follow your coding standards every time
  • Design system integration - No more className="bg-blue-500", uses your design tokens
  • Built-in testing - Every component includes test selectors and accessibility attributes
  • ReScript/React focused - Type-safe components that compile correctly

Quick Start

git clone https://github.com/hew/protocol-ui
cd protocol-ui
npm install
# Add your OpenAI API key to .envecho"OPENAI_API_KEY=your-key-here"> .env
# Generate a component
npm run generate:component

The CLI will prompt you for what you want to build:

? Describe the component: A button with primary and secondary variants
? Component name: ActionButton ? Interactive features? Yes
✅ Generated ActionButton.res

📖 Example Output

Input Prompt

"A card component with title, content, and optional action button"

Generated ReScript Component

// InfoCard.resopenReactopenDesignSystemtypeprops= {
title: string,
content: string,
actionText?: string,
onAction?: unit=>unit,
}
// Test selectors for Playwrightletselectors= {
root: "[data-test-id='InfoCard']",
title: "[data-test-id='InfoCard-title']",
action: "[data-test-id='InfoCard-action']",
}
@react.componentletmake= (~title, ~content, ~actionText=?, ~onAction=?) => {
<divdata-test-id="InfoCard"className={cx([
"p-6", "border", "rounded-lg", "shadow-sm",
backgroundColorToClass(Surface)
])}>
<h3data-test-id="InfoCard-title"className={cx([
"text-lg", "font-semibold", "mb-2",
colorToClass(OnSurface)
])}>
{title->React.string}
</h3>
<pclassName={cx([
"text-base", "mb-4",
colorToClass(OnSurfaceVariant)
])}>
{content->React.string}
</p>
{switch (actionText, onAction) {
| (Some(text), Some(handler)) =>
<buttondata-test-id="InfoCard-action"className={cx([
"px-4",
"py-2", "rounded",
backgroundColorToClass(Primary),
colorToClass(OnPrimary)
])}
onClick={_=>handler()}
aria-label={`Action: ${text}`}>
{text->React.string}
</button>
| _=>React.null
}}
</div>
}

How It Works

Input → AI Generation → Validation → ReScript Component

The system generates ReScript code, then validates it against your rules before saving. If validation fails, it tries again until it gets it right.

Core Files

  • src/ai-generator/ReScriptGenerator.res - AI generation logic
  • scripts/theme.js - Automated color theming system
  • src/core/DesignSystem.res - Design system integration

Validation Rules

Generated components must follow these patterns:

Required:

  • Test IDs: data-test-id="ComponentName"
  • Design system: backgroundColorToClass(Primary) instead of bg-blue-500
  • Accessibility: ARIA labels on interactive elements
  • ReScript types: Proper type annotations

Forbidden:

  • Direct CSS classes: className="bg-blue-500"
  • Missing test hooks
  • Poor accessibility

Design System Integration

Uses your design tokens instead of hardcoded values:

// ✅ Generated code uses design systemclassName={backgroundColorToClass(Primary)}
className={cx([colorToClass(OnSurface), "text-lg"])}
// ❌ Never generates direct classes className="bg-blue-500 text-white"// Validation prevents this

Change your theme with one command:

node scripts/theme.js "#1f2937" corporate

Testing Integration

Every generated component includes test selectors:

// Auto-generated in every componentletselectors= {
root: "[data-test-id='MyComponent']",
button: "[data-test-id='MyComponent-button']",
}

Use them in your tests:

// MyComponent.test.resopenPlaywrightlettestComponentClick=async () => {
letpage=awaitPage.create()
awaitPage.click(page, MyComponent.selectors.button)
awaitExpect.toBeVisible(Page.locator(page, MyComponent.selectors.root))
}

Configuration

Set your OpenAI API key:

echo"OPENAI_API_KEY=your-key-here"> .env

Development

npm run dev # Start dev server
rescript -w # Watch ReScript files
npm run generate:component # Generate a component

License

MIT License - see LICENSE file for details.

About

AI-generated components that follow your rules.

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Protocol UI

AI-generated components that follow your rules.

ReScriptTypeScriptReactAI

The Problem

Most AI code generation is unreliable. You get components with missing accessibility, broken patterns, and inconsistent styling. Each generation is a roll of the dice. We can do better.

The Solution

Instead of hoping AI understands your requirements, encode them as rules that cannot be violated. Generate components that always follow your patterns, use your design system, and include proper testing hooks.

// Your rules, enforced automaticallyletvalidateComponent= (code: string) => {
// ✅ Must use design system functions// ✅ Must include test selectors // ✅ Must have accessibility attributes// ❌ Cannot use direct CSS classes
}

What You Get

  • Reliable generation - Components that follow your coding standards every time
  • Design system integration - No more className="bg-blue-500", uses your design tokens
  • Built-in testing - Every component includes test selectors and accessibility attributes
  • ReScript/React focused - Type-safe components that compile correctly

Quick Start

git clone https://github.com/hew/protocol-ui
cd protocol-ui
npm install
# Add your OpenAI API key to .envecho"OPENAI_API_KEY=your-key-here"> .env
# Generate a component
npm run generate:component

The CLI will prompt you for what you want to build:

? Describe the component: A button with primary and secondary variants
? Component name: ActionButton ? Interactive features? Yes
✅ Generated ActionButton.res

📖 Example Output

Input Prompt

"A card component with title, content, and optional action button"

Generated ReScript Component

// InfoCard.resopenReactopenDesignSystemtypeprops= {
title: string,
content: string,
actionText?: string,
onAction?: unit=>unit,
}
// Test selectors for Playwrightletselectors= {
root: "[data-test-id='InfoCard']",
title: "[data-test-id='InfoCard-title']",
action: "[data-test-id='InfoCard-action']",
}
@react.componentletmake= (~title, ~content, ~actionText=?, ~onAction=?) => {
<divdata-test-id="InfoCard"className={cx([
"p-6", "border", "rounded-lg", "shadow-sm",
backgroundColorToClass(Surface)
])}>
<h3data-test-id="InfoCard-title"className={cx([
"text-lg", "font-semibold", "mb-2",
colorToClass(OnSurface)
])}>
{title->React.string}
</h3>
<pclassName={cx([
"text-base", "mb-4",
colorToClass(OnSurfaceVariant)
])}>
{content->React.string}
</p>
{switch (actionText, onAction) {
| (Some(text), Some(handler)) =>
<buttondata-test-id="InfoCard-action"className={cx([
"px-4",
"py-2", "rounded",
backgroundColorToClass(Primary),
colorToClass(OnPrimary)
])}
onClick={_=>handler()}
aria-label={`Action: ${text}`}>
{text->React.string}
</button>
| _=>React.null
}}
</div>
}

How It Works

Input → AI Generation → Validation → ReScript Component

The system generates ReScript code, then validates it against your rules before saving. If validation fails, it tries again until it gets it right.

Core Files

  • src/ai-generator/ReScriptGenerator.res - AI generation logic
  • scripts/theme.js - Automated color theming system
  • src/core/DesignSystem.res - Design system integration

Validation Rules

Generated components must follow these patterns:

Required:

  • Test IDs: data-test-id="ComponentName"
  • Design system: backgroundColorToClass(Primary) instead of bg-blue-500
  • Accessibility: ARIA labels on interactive elements
  • ReScript types: Proper type annotations

Forbidden:

  • Direct CSS classes: className="bg-blue-500"
  • Missing test hooks
  • Poor accessibility

Design System Integration

Uses your design tokens instead of hardcoded values:

// ✅ Generated code uses design systemclassName={backgroundColorToClass(Primary)}
className={cx([colorToClass(OnSurface), "text-lg"])}
// ❌ Never generates direct classes className="bg-blue-500 text-white"// Validation prevents this

Change your theme with one command:

node scripts/theme.js "#1f2937" corporate

Testing Integration

Every generated component includes test selectors:

// Auto-generated in every componentletselectors= {
root: "[data-test-id='MyComponent']",
button: "[data-test-id='MyComponent-button']",
}

Use them in your tests:

// MyComponent.test.resopenPlaywrightlettestComponentClick=async () => {
letpage=awaitPage.create()
awaitPage.click(page, MyComponent.selectors.button)
awaitExpect.toBeVisible(Page.locator(page, MyComponent.selectors.root))
}

Configuration

Set your OpenAI API key:

echo"OPENAI_API_KEY=your-key-here"> .env

Development

npm run dev # Start dev server
rescript -w # Watch ReScript files
npm run generate:component # Generate a component

License

MIT License - see LICENSE file for details.

About

AI-generated components that follow your rules.

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Protocol UI

AI-generated components that follow your rules.

ReScriptTypeScriptReactAI

The Problem

Most AI code generation is unreliable. You get components with missing accessibility, broken patterns, and inconsistent styling. Each generation is a roll of the dice. We can do better.

The Solution

Instead of hoping AI understands your requirements, encode them as rules that cannot be violated. Generate components that always follow your patterns, use your design system, and include proper testing hooks.

// Your rules, enforced automaticallyletvalidateComponent= (code: string) => {
// ✅ Must use design system functions// ✅ Must include test selectors // ✅ Must have accessibility attributes// ❌ Cannot use direct CSS classes
}

What You Get

  • Reliable generation - Components that follow your coding standards every time
  • Design system integration - No more className="bg-blue-500", uses your design tokens
  • Built-in testing - Every component includes test selectors and accessibility attributes
  • ReScript/React focused - Type-safe components that compile correctly

Quick Start

git clone https://github.com/hew/protocol-ui
cd protocol-ui
npm install
# Add your OpenAI API key to .envecho"OPENAI_API_KEY=your-key-here"> .env
# Generate a component
npm run generate:component

The CLI will prompt you for what you want to build:

? Describe the component: A button with primary and secondary variants
? Component name: ActionButton ? Interactive features? Yes
✅ Generated ActionButton.res

📖 Example Output

Input Prompt

"A card component with title, content, and optional action button"

Generated ReScript Component

// InfoCard.resopenReactopenDesignSystemtypeprops= {
title: string,
content: string,
actionText?: string,
onAction?: unit=>unit,
}
// Test selectors for Playwrightletselectors= {
root: "[data-test-id='InfoCard']",
title: "[data-test-id='InfoCard-title']",
action: "[data-test-id='InfoCard-action']",
}
@react.componentletmake= (~title, ~content, ~actionText=?, ~onAction=?) => {
<divdata-test-id="InfoCard"className={cx([
"p-6", "border", "rounded-lg", "shadow-sm",
backgroundColorToClass(Surface)
])}>
<h3data-test-id="InfoCard-title"className={cx([
"text-lg", "font-semibold", "mb-2",
colorToClass(OnSurface)
])}>
{title->React.string}
</h3>
<pclassName={cx([
"text-base", "mb-4",
colorToClass(OnSurfaceVariant)
])}>
{content->React.string}
</p>
{switch (actionText, onAction) {
| (Some(text), Some(handler)) =>
<buttondata-test-id="InfoCard-action"className={cx([
"px-4",
"py-2", "rounded",
backgroundColorToClass(Primary),
colorToClass(OnPrimary)
])}
onClick={_=>handler()}
aria-label={`Action: ${text}`}>
{text->React.string}
</button>
| _=>React.null
}}
</div>
}

How It Works

Input → AI Generation → Validation → ReScript Component

The system generates ReScript code, then validates it against your rules before saving. If validation fails, it tries again until it gets it right.

Core Files

  • src/ai-generator/ReScriptGenerator.res - AI generation logic
  • scripts/theme.js - Automated color theming system
  • src/core/DesignSystem.res - Design system integration

Validation Rules

Generated components must follow these patterns:

Required:

  • Test IDs: data-test-id="ComponentName"
  • Design system: backgroundColorToClass(Primary) instead of bg-blue-500
  • Accessibility: ARIA labels on interactive elements
  • ReScript types: Proper type annotations

Forbidden:

  • Direct CSS classes: className="bg-blue-500"
  • Missing test hooks
  • Poor accessibility

Design System Integration

Uses your design tokens instead of hardcoded values:

// ✅ Generated code uses design systemclassName={backgroundColorToClass(Primary)}
className={cx([colorToClass(OnSurface), "text-lg"])}
// ❌ Never generates direct classes className="bg-blue-500 text-white"// Validation prevents this

Change your theme with one command:

node scripts/theme.js "#1f2937" corporate

Testing Integration

Every generated component includes test selectors:

// Auto-generated in every componentletselectors= {
root: "[data-test-id='MyComponent']",
button: "[data-test-id='MyComponent-button']",
}

Use them in your tests:

// MyComponent.test.resopenPlaywrightlettestComponentClick=async () => {
letpage=awaitPage.create()
awaitPage.click(page, MyComponent.selectors.button)
awaitExpect.toBeVisible(Page.locator(page, MyComponent.selectors.root))
}

Configuration

Set your OpenAI API key:

echo"OPENAI_API_KEY=your-key-here"> .env

Development

npm run dev # Start dev server
rescript -w # Watch ReScript files
npm run generate:component # Generate a component

License

MIT License - see LICENSE file for details.

About

AI-generated components that follow your rules.

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Protocol UI

AI-generated components that follow your rules.

ReScriptTypeScriptReactAI

The Problem

Most AI code generation is unreliable. You get components with missing accessibility, broken patterns, and inconsistent styling. Each generation is a roll of the dice. We can do better.

The Solution

Instead of hoping AI understands your requirements, encode them as rules that cannot be violated. Generate components that always follow your patterns, use your design system, and include proper testing hooks.

// Your rules, enforced automaticallyletvalidateComponent= (code: string) => {
// ✅ Must use design system functions// ✅ Must include test selectors // ✅ Must have accessibility attributes// ❌ Cannot use direct CSS classes
}

What You Get

  • Reliable generation - Components that follow your coding standards every time
  • Design system integration - No more className="bg-blue-500", uses your design tokens
  • Built-in testing - Every component includes test selectors and accessibility attributes
  • ReScript/React focused - Type-safe components that compile correctly

Quick Start

git clone https://github.com/hew/protocol-ui
cd protocol-ui
npm install
# Add your OpenAI API key to .envecho"OPENAI_API_KEY=your-key-here"> .env
# Generate a component
npm run generate:component

The CLI will prompt you for what you want to build:

? Describe the component: A button with primary and secondary variants
? Component name: ActionButton ? Interactive features? Yes
✅ Generated ActionButton.res

📖 Example Output

Input Prompt

"A card component with title, content, and optional action button"

Generated ReScript Component

// InfoCard.resopenReactopenDesignSystemtypeprops= {
title: string,
content: string,
actionText?: string,
onAction?: unit=>unit,
}
// Test selectors for Playwrightletselectors= {
root: "[data-test-id='InfoCard']",
title: "[data-test-id='InfoCard-title']",
action: "[data-test-id='InfoCard-action']",
}
@react.componentletmake= (~title, ~content, ~actionText=?, ~onAction=?) => {
<divdata-test-id="InfoCard"className={cx([
"p-6", "border", "rounded-lg", "shadow-sm",
backgroundColorToClass(Surface)
])}>
<h3data-test-id="InfoCard-title"className={cx([
"text-lg", "font-semibold", "mb-2",
colorToClass(OnSurface)
])}>
{title->React.string}
</h3>
<pclassName={cx([
"text-base", "mb-4",
colorToClass(OnSurfaceVariant)
])}>
{content->React.string}
</p>
{switch (actionText, onAction) {
| (Some(text), Some(handler)) =>
<buttondata-test-id="InfoCard-action"className={cx([
"px-4",
"py-2", "rounded",
backgroundColorToClass(Primary),
colorToClass(OnPrimary)
])}
onClick={_=>handler()}
aria-label={`Action: ${text}`}>
{text->React.string}
</button>
| _=>React.null
}}
</div>
}

How It Works

Input → AI Generation → Validation → ReScript Component

The system generates ReScript code, then validates it against your rules before saving. If validation fails, it tries again until it gets it right.

Core Files

  • src/ai-generator/ReScriptGenerator.res - AI generation logic
  • scripts/theme.js - Automated color theming system
  • src/core/DesignSystem.res - Design system integration

Validation Rules

Generated components must follow these patterns:

Required:

  • Test IDs: data-test-id="ComponentName"
  • Design system: backgroundColorToClass(Primary) instead of bg-blue-500
  • Accessibility: ARIA labels on interactive elements
  • ReScript types: Proper type annotations

Forbidden:

  • Direct CSS classes: className="bg-blue-500"
  • Missing test hooks
  • Poor accessibility

Design System Integration

Uses your design tokens instead of hardcoded values:

// ✅ Generated code uses design systemclassName={backgroundColorToClass(Primary)}
className={cx([colorToClass(OnSurface), "text-lg"])}
// ❌ Never generates direct classes className="bg-blue-500 text-white"// Validation prevents this

Change your theme with one command:

node scripts/theme.js "#1f2937" corporate

Testing Integration

Every generated component includes test selectors:

// Auto-generated in every componentletselectors= {
root: "[data-test-id='MyComponent']",
button: "[data-test-id='MyComponent-button']",
}

Use them in your tests:

// MyComponent.test.resopenPlaywrightlettestComponentClick=async () => {
letpage=awaitPage.create()
awaitPage.click(page, MyComponent.selectors.button)
awaitExpect.toBeVisible(Page.locator(page, MyComponent.selectors.root))
}

Configuration

Set your OpenAI API key:

echo"OPENAI_API_KEY=your-key-here"> .env

Development

npm run dev # Start dev server
rescript -w # Watch ReScript files
npm run generate:component # Generate a component

License

MIT License - see LICENSE file for details.

About

AI-generated components that follow your rules.

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Protocol UI

AI-generated components that follow your rules.

ReScriptTypeScriptReactAI

The Problem

Most AI code generation is unreliable. You get components with missing accessibility, broken patterns, and inconsistent styling. Each generation is a roll of the dice. We can do better.

The Solution

Instead of hoping AI understands your requirements, encode them as rules that cannot be violated. Generate components that always follow your patterns, use your design system, and include proper testing hooks.

// Your rules, enforced automaticallyletvalidateComponent= (code: string) => {
// ✅ Must use design system functions// ✅ Must include test selectors // ✅ Must have accessibility attributes// ❌ Cannot use direct CSS classes
}

What You Get

  • Reliable generation - Components that follow your coding standards every time
  • Design system integration - No more className="bg-blue-500", uses your design tokens
  • Built-in testing - Every component includes test selectors and accessibility attributes
  • ReScript/React focused - Type-safe components that compile correctly

Quick Start

git clone https://github.com/hew/protocol-ui
cd protocol-ui
npm install
# Add your OpenAI API key to .envecho"OPENAI_API_KEY=your-key-here"> .env
# Generate a component
npm run generate:component

The CLI will prompt you for what you want to build:

? Describe the component: A button with primary and secondary variants
? Component name: ActionButton ? Interactive features? Yes
✅ Generated ActionButton.res

📖 Example Output

Input Prompt

"A card component with title, content, and optional action button"

Generated ReScript Component

// InfoCard.resopenReactopenDesignSystemtypeprops= {
title: string,
content: string,
actionText?: string,
onAction?: unit=>unit,
}
// Test selectors for Playwrightletselectors= {
root: "[data-test-id='InfoCard']",
title: "[data-test-id='InfoCard-title']",
action: "[data-test-id='InfoCard-action']",
}
@react.componentletmake= (~title, ~content, ~actionText=?, ~onAction=?) => {
<divdata-test-id="InfoCard"className={cx([
"p-6", "border", "rounded-lg", "shadow-sm",
backgroundColorToClass(Surface)
])}>
<h3data-test-id="InfoCard-title"className={cx([
"text-lg", "font-semibold", "mb-2",
colorToClass(OnSurface)
])}>
{title->React.string}
</h3>
<pclassName={cx([
"text-base", "mb-4",
colorToClass(OnSurfaceVariant)
])}>
{content->React.string}
</p>
{switch (actionText, onAction) {
| (Some(text), Some(handler)) =>
<buttondata-test-id="InfoCard-action"className={cx([
"px-4",
"py-2", "rounded",
backgroundColorToClass(Primary),
colorToClass(OnPrimary)
])}
onClick={_=>handler()}
aria-label={`Action: ${text}`}>
{text->React.string}
</button>
| _=>React.null
}}
</div>
}

How It Works

Input → AI Generation → Validation → ReScript Component

The system generates ReScript code, then validates it against your rules before saving. If validation fails, it tries again until it gets it right.

Core Files

  • src/ai-generator/ReScriptGenerator.res - AI generation logic
  • scripts/theme.js - Automated color theming system
  • src/core/DesignSystem.res - Design system integration

Validation Rules

Generated components must follow these patterns:

Required:

  • Test IDs: data-test-id="ComponentName"
  • Design system: backgroundColorToClass(Primary) instead of bg-blue-500
  • Accessibility: ARIA labels on interactive elements
  • ReScript types: Proper type annotations

Forbidden:

  • Direct CSS classes: className="bg-blue-500"
  • Missing test hooks
  • Poor accessibility

Design System Integration

Uses your design tokens instead of hardcoded values:

// ✅ Generated code uses design systemclassName={backgroundColorToClass(Primary)}
className={cx([colorToClass(OnSurface), "text-lg"])}
// ❌ Never generates direct classes className="bg-blue-500 text-white"// Validation prevents this

Change your theme with one command:

node scripts/theme.js "#1f2937" corporate

Testing Integration

Every generated component includes test selectors:

// Auto-generated in every componentletselectors= {
root: "[data-test-id='MyComponent']",
button: "[data-test-id='MyComponent-button']",
}

Use them in your tests:

// MyComponent.test.resopenPlaywrightlettestComponentClick=async () => {
letpage=awaitPage.create()
awaitPage.click(page, MyComponent.selectors.button)
awaitExpect.toBeVisible(Page.locator(page, MyComponent.selectors.root))
}

Configuration

Set your OpenAI API key:

echo"OPENAI_API_KEY=your-key-here"> .env

Development

npm run dev # Start dev server
rescript -w # Watch ReScript files
npm run generate:component # Generate a component

License

MIT License - see LICENSE file for details.

About

AI-generated components that follow your rules.

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Protocol UI

AI-generated components that follow your rules.

ReScriptTypeScriptReactAI

The Problem

Most AI code generation is unreliable. You get components with missing accessibility, broken patterns, and inconsistent styling. Each generation is a roll of the dice. We can do better.

The Solution

Instead of hoping AI understands your requirements, encode them as rules that cannot be violated. Generate components that always follow your patterns, use your design system, and include proper testing hooks.

// Your rules, enforced automaticallyletvalidateComponent= (code: string) => {
// ✅ Must use design system functions// ✅ Must include test selectors // ✅ Must have accessibility attributes// ❌ Cannot use direct CSS classes
}

What You Get

  • Reliable generation - Components that follow your coding standards every time
  • Design system integration - No more className="bg-blue-500", uses your design tokens
  • Built-in testing - Every component includes test selectors and accessibility attributes
  • ReScript/React focused - Type-safe components that compile correctly

Quick Start

git clone https://github.com/hew/protocol-ui
cd protocol-ui
npm install
# Add your OpenAI API key to .envecho"OPENAI_API_KEY=your-key-here"> .env
# Generate a component
npm run generate:component

The CLI will prompt you for what you want to build:

? Describe the component: A button with primary and secondary variants
? Component name: ActionButton ? Interactive features? Yes
✅ Generated ActionButton.res

📖 Example Output

Input Prompt

"A card component with title, content, and optional action button"

Generated ReScript Component

// InfoCard.resopenReactopenDesignSystemtypeprops= {
title: string,
content: string,
actionText?: string,
onAction?: unit=>unit,
}
// Test selectors for Playwrightletselectors= {
root: "[data-test-id='InfoCard']",
title: "[data-test-id='InfoCard-title']",
action: "[data-test-id='InfoCard-action']",
}
@react.componentletmake= (~title, ~content, ~actionText=?, ~onAction=?) => {
<divdata-test-id="InfoCard"className={cx([
"p-6", "border", "rounded-lg", "shadow-sm",
backgroundColorToClass(Surface)
])}>
<h3data-test-id="InfoCard-title"className={cx([
"text-lg", "font-semibold", "mb-2",
colorToClass(OnSurface)
])}>
{title->React.string}
</h3>
<pclassName={cx([
"text-base", "mb-4",
colorToClass(OnSurfaceVariant)
])}>
{content->React.string}
</p>
{switch (actionText, onAction) {
| (Some(text), Some(handler)) =>
<buttondata-test-id="InfoCard-action"className={cx([
"px-4",
"py-2", "rounded",
backgroundColorToClass(Primary),
colorToClass(OnPrimary)
])}
onClick={_=>handler()}
aria-label={`Action: ${text}`}>
{text->React.string}
</button>
| _=>React.null
}}
</div>
}

How It Works

Input → AI Generation → Validation → ReScript Component

The system generates ReScript code, then validates it against your rules before saving. If validation fails, it tries again until it gets it right.

Core Files

  • src/ai-generator/ReScriptGenerator.res - AI generation logic
  • scripts/theme.js - Automated color theming system
  • src/core/DesignSystem.res - Design system integration

Validation Rules

Generated components must follow these patterns:

Required:

  • Test IDs: data-test-id="ComponentName"
  • Design system: backgroundColorToClass(Primary) instead of bg-blue-500
  • Accessibility: ARIA labels on interactive elements
  • ReScript types: Proper type annotations

Forbidden:

  • Direct CSS classes: className="bg-blue-500"
  • Missing test hooks
  • Poor accessibility

Design System Integration

Uses your design tokens instead of hardcoded values:

// ✅ Generated code uses design systemclassName={backgroundColorToClass(Primary)}
className={cx([colorToClass(OnSurface), "text-lg"])}
// ❌ Never generates direct classes className="bg-blue-500 text-white"// Validation prevents this

Change your theme with one command:

node scripts/theme.js "#1f2937" corporate

Testing Integration

Every generated component includes test selectors:

// Auto-generated in every componentletselectors= {
root: "[data-test-id='MyComponent']",
button: "[data-test-id='MyComponent-button']",
}

Use them in your tests:

// MyComponent.test.resopenPlaywrightlettestComponentClick=async () => {
letpage=awaitPage.create()
awaitPage.click(page, MyComponent.selectors.button)
awaitExpect.toBeVisible(Page.locator(page, MyComponent.selectors.root))
}

Configuration

Set your OpenAI API key:

echo"OPENAI_API_KEY=your-key-here"> .env

Development

npm run dev # Start dev server
rescript -w # Watch ReScript files
npm run generate:component # Generate a component

License

MIT License - see LICENSE file for details.

About

AI-generated components that follow your rules.

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages