mirror of
https://github.com/lukaszraczylo/homebrew-taps.git
synced 2026-10-12 00:45:10 +00:00
docs: list harness-sync and redesign the tap site
Replace the Tailwind CDN page with a static stylesheet. Make the generator emit the new markup and fill the Brewfile block from the casks. Map cask names to repository names for projects whose names differ.
This commit is contained in:
@@ -6,8 +6,9 @@ Custom Homebrew tap for macOS and Linux tools by Lukasz Raczylo.
|
|||||||
|
|
||||||
| Cask | Description |
|
| Cask | Description |
|
||||||
|------|-------------|
|
|------|-------------|
|
||||||
|
| [harness-sync](https://github.com/lukaszraczylo/harness-sync) | Sync skills, agents, MCP, and LLM endpoints across multiple LLM harnesses |
|
||||||
| [kportal](https://github.com/lukaszraczylo/kportal) | Modern Kubernetes port-forward manager with interactive TUI |
|
| [kportal](https://github.com/lukaszraczylo/kportal) | Modern Kubernetes port-forward manager with interactive TUI |
|
||||||
| [lolcathost](https://github.com/lukaszraczylo/lolcathost) | Dynamic hosts file manager with interactive terminal UI |
|
| [lolcathost](https://github.com/lukaszraczylo/lolcathost) | Dynamic host management tool with TUI |
|
||||||
| [semver-generator](https://github.com/lukaszraczylo/semver-generator) | Automatic semantic version generator based on git commit messages |
|
| [semver-generator](https://github.com/lukaszraczylo/semver-generator) | Automatic semantic version generator based on git commit messages |
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
@@ -36,6 +37,7 @@ Add to your Brewfile:
|
|||||||
|
|
||||||
```ruby
|
```ruby
|
||||||
tap "lukaszraczylo/taps"
|
tap "lukaszraczylo/taps"
|
||||||
|
cask "harness-sync"
|
||||||
cask "kportal"
|
cask "kportal"
|
||||||
cask "lolcathost"
|
cask "lolcathost"
|
||||||
cask "semver-generator"
|
cask "semver-generator"
|
||||||
|
|||||||
+207
-347
@@ -1,420 +1,280 @@
|
|||||||
<!doctype html>
|
<!doctype html>
|
||||||
<html lang="en" class="scroll-smooth">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>Homebrew Tap - lukaszraczylo</title>
|
<meta name="color-scheme" content="light dark" />
|
||||||
|
<title>Homebrew tap - lukaszraczylo</title>
|
||||||
<meta
|
<meta
|
||||||
name="description"
|
name="description"
|
||||||
content="Homebrew tap for macOS and Linux tools by Lukasz Raczylo. Install developer tools easily with brew."
|
content="Homebrew tap with command-line tools by Lukasz Raczylo: kportal, lolcathost, semver-generator and harness-sync."
|
||||||
/>
|
|
||||||
<script src="https://cdn.tailwindcss.com"></script>
|
|
||||||
<script>
|
|
||||||
tailwind.config = {
|
|
||||||
darkMode: 'class'
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<link
|
|
||||||
rel="stylesheet"
|
|
||||||
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
|
|
||||||
/>
|
/>
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||||
<link
|
<link
|
||||||
href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap"
|
href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;600&family=IBM+Plex+Mono:wght@400;500&display=swap"
|
||||||
rel="stylesheet"
|
rel="stylesheet"
|
||||||
/>
|
/>
|
||||||
<style>
|
<style>
|
||||||
body { font-family: "Inter", sans-serif; }
|
:root {
|
||||||
code, pre { font-family: "JetBrains Mono", monospace; }
|
--bg: #ffffff;
|
||||||
.theme-transition {
|
--fg: #111418;
|
||||||
transition: background-color 0.3s ease, color 0.3s ease, border-color 0.3s ease;
|
--muted: #5b6470;
|
||||||
|
--line: #e3e6ea;
|
||||||
|
--code-bg: #f5f6f8;
|
||||||
|
--accent: #b45309;
|
||||||
|
--accent-fg: #ffffff;
|
||||||
|
--sans: "IBM Plex Sans", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
|
||||||
|
--mono: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
|
||||||
}
|
}
|
||||||
@keyframes fadeInUp {
|
@media (prefers-color-scheme: dark) {
|
||||||
from { opacity: 0; transform: translateY(20px); }
|
:root {
|
||||||
to { opacity: 1; transform: translateY(0); }
|
--bg: #0e1013;
|
||||||
|
--fg: #e8eaed;
|
||||||
|
--muted: #98a1ad;
|
||||||
|
--line: #262b32;
|
||||||
|
--code-bg: #171a1f;
|
||||||
|
--accent: #f59e0b;
|
||||||
|
--accent-fg: #0e1013;
|
||||||
}
|
}
|
||||||
@keyframes float {
|
|
||||||
0%, 100% { transform: translateY(0px); }
|
|
||||||
50% { transform: translateY(-10px); }
|
|
||||||
}
|
}
|
||||||
.animate-fade-in-up { animation: fadeInUp 0.6s ease-out; }
|
* { box-sizing: border-box; }
|
||||||
.animate-float { animation: float 3s ease-in-out infinite; }
|
html { -webkit-text-size-adjust: 100%; }
|
||||||
.glass {
|
body {
|
||||||
background: rgba(255, 255, 255, 0.7);
|
margin: 0;
|
||||||
backdrop-filter: blur(10px);
|
background: var(--bg);
|
||||||
-webkit-backdrop-filter: blur(10px);
|
color: var(--fg);
|
||||||
border: 1px solid rgba(255, 255, 255, 0.2);
|
font: 16px/1.6 var(--sans);
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
}
|
}
|
||||||
.dark .glass {
|
a { color: inherit; text-decoration-color: var(--line); text-underline-offset: 3px; }
|
||||||
background: rgba(17, 24, 39, 0.7);
|
a:hover { text-decoration-color: var(--accent); }
|
||||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
a:focus-visible, button:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
|
||||||
|
code, pre { font-family: var(--mono); font-size: 0.875rem; }
|
||||||
|
.wrap { max-width: 56rem; margin: 0 auto; padding: 0 1.25rem; }
|
||||||
|
|
||||||
|
header.top { border-bottom: 1px solid var(--line); }
|
||||||
|
header.top .wrap {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
height: 3.5rem;
|
||||||
}
|
}
|
||||||
.gradient-text {
|
.brand { font-family: var(--mono); font-weight: 500; text-decoration: none; }
|
||||||
background: linear-gradient(135deg, #10b981 0%, #3b82f6 100%);
|
.brand span { color: var(--accent); }
|
||||||
-webkit-background-clip: text;
|
nav.links { display: flex; gap: 1.5rem; font-size: 0.9375rem; color: var(--muted); }
|
||||||
-webkit-text-fill-color: transparent;
|
nav.links a { text-decoration: none; }
|
||||||
background-clip: text;
|
nav.links a:hover { color: var(--fg); }
|
||||||
|
|
||||||
|
.intro { padding: 4rem 0 3rem; }
|
||||||
|
h1 {
|
||||||
|
margin: 0 0 1rem;
|
||||||
|
font-size: clamp(1.875rem, 5vw, 2.75rem);
|
||||||
|
line-height: 1.15;
|
||||||
|
font-weight: 600;
|
||||||
|
letter-spacing: -0.02em;
|
||||||
}
|
}
|
||||||
.dark .gradient-text {
|
.intro p { margin: 0 0 1.5rem; max-width: 38rem; color: var(--muted); font-size: 1.125rem; }
|
||||||
background: linear-gradient(135deg, #34d399 0%, #60a5fa 100%);
|
|
||||||
-webkit-background-clip: text;
|
section { padding: 2.5rem 0; border-top: 1px solid var(--line); }
|
||||||
-webkit-text-fill-color: transparent;
|
h2 { margin: 0 0 1.5rem; font-size: 1.125rem; font-weight: 600; }
|
||||||
background-clip: text;
|
h2 small { margin-left: 0.5rem; color: var(--muted); font-weight: 400; font-size: 0.875rem; }
|
||||||
}
|
|
||||||
.shadow-modern { box-shadow: 0 10px 40px -10px rgba(0, 0, 0, 0.1); }
|
.cmd {
|
||||||
.dark .shadow-modern { box-shadow: 0 10px 40px -10px rgba(0, 0, 0, 0.4); }
|
|
||||||
html { scroll-behavior: smooth; }
|
|
||||||
.code-block {
|
|
||||||
position: relative;
|
position: relative;
|
||||||
|
background: var(--code-bg);
|
||||||
|
border: 1px solid var(--line);
|
||||||
|
border-radius: 6px;
|
||||||
}
|
}
|
||||||
|
.cmd pre { margin: 0; padding: 0.75rem 4.5rem 0.75rem 1rem; overflow-x: auto; }
|
||||||
.copy-btn {
|
.copy-btn {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0.5rem;
|
top: 50%;
|
||||||
right: 0.5rem;
|
right: 0.5rem;
|
||||||
padding: 0.25rem 0.5rem;
|
transform: translateY(-50%);
|
||||||
background: rgba(255, 255, 255, 0.1);
|
padding: 0.25rem 0.625rem;
|
||||||
border: 1px solid rgba(255, 255, 255, 0.2);
|
background: var(--bg);
|
||||||
border-radius: 0.375rem;
|
color: var(--muted);
|
||||||
color: #9ca3af;
|
border: 1px solid var(--line);
|
||||||
font-size: 0.75rem;
|
border-radius: 4px;
|
||||||
|
font: 500 0.75rem var(--sans);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
transition: all 0.2s;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 0.25rem;
|
|
||||||
}
|
}
|
||||||
.copy-btn:hover {
|
.copy-btn:hover { color: var(--fg); border-color: var(--muted); }
|
||||||
background: rgba(255, 255, 255, 0.2);
|
.copy-btn.copied { color: var(--accent); border-color: var(--accent); }
|
||||||
color: #fff;
|
|
||||||
}
|
.projects { list-style: none; margin: 0; padding: 0; border-top: 1px solid var(--line); }
|
||||||
.copy-btn.copied {
|
.project { padding: 1.5rem 0; border-bottom: 1px solid var(--line); }
|
||||||
background: rgba(16, 185, 129, 0.3);
|
.project-head { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0.25rem 0.75rem; }
|
||||||
border-color: rgba(16, 185, 129, 0.5);
|
.project h3 { margin: 0; font-family: var(--mono); font-size: 1.0625rem; font-weight: 500; }
|
||||||
color: #34d399;
|
.meta { color: var(--muted); font-size: 0.8125rem; font-family: var(--mono); }
|
||||||
|
.project-links { margin-left: auto; display: flex; gap: 1rem; font-size: 0.875rem; color: var(--muted); }
|
||||||
|
.project-links a:hover { color: var(--fg); }
|
||||||
|
.project p { margin: 0.375rem 0 1rem; color: var(--muted); }
|
||||||
|
|
||||||
|
.note { margin: 0 0 1rem; color: var(--muted); }
|
||||||
|
.note + .cmd { margin-bottom: 1.5rem; }
|
||||||
|
|
||||||
|
footer { border-top: 1px solid var(--line); padding: 1.5rem 0 3rem; color: var(--muted); font-size: 0.875rem; }
|
||||||
|
footer .wrap { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 0.5rem 1.5rem; }
|
||||||
|
footer a { text-decoration: none; }
|
||||||
|
footer a:hover { color: var(--fg); }
|
||||||
|
|
||||||
|
@media (max-width: 36rem) {
|
||||||
|
.intro { padding: 2.5rem 0 2rem; }
|
||||||
|
.project-links { margin-left: 0; width: 100%; }
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<script>
|
|
||||||
if (localStorage.theme === "dark" || (!("theme" in localStorage) && window.matchMedia("(prefers-color-scheme: dark)").matches)) {
|
|
||||||
document.documentElement.classList.add("dark");
|
|
||||||
} else {
|
|
||||||
document.documentElement.classList.remove("dark");
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
</head>
|
</head>
|
||||||
<body class="bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100 theme-transition">
|
<body>
|
||||||
<!-- Navigation -->
|
<header class="top">
|
||||||
<nav class="fixed w-full glass shadow-modern z-50 theme-transition">
|
<div class="wrap">
|
||||||
<div class="max-w-6xl mx-auto px-4 sm:px-6">
|
<a class="brand" href="#">brew<span>/</span>taps</a>
|
||||||
<div class="flex justify-between h-16 items-center">
|
<nav class="links" aria-label="Primary">
|
||||||
<a href="#" class="flex items-center hover:opacity-80 transition-opacity duration-300 gap-2">
|
<a href="#projects">Projects</a>
|
||||||
<i class="fas fa-beer text-2xl text-amber-500"></i>
|
<a href="#install">Install</a>
|
||||||
<span class="text-2xl font-bold gradient-text">brew-taps</span>
|
<a href="https://github.com/lukaszraczylo/homebrew-taps">GitHub</a>
|
||||||
</a>
|
|
||||||
<div class="hidden md:flex space-x-6">
|
|
||||||
<a href="#casks" class="text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-gray-100 font-medium">Available Casks</a>
|
|
||||||
<a href="#installation" class="text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-gray-100 font-medium">Installation</a>
|
|
||||||
</div>
|
|
||||||
<div class="flex items-center space-x-4">
|
|
||||||
<button id="theme-toggle" class="text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-gray-100 p-2 min-w-[44px] min-h-[44px] flex items-center justify-center" aria-label="Toggle theme">
|
|
||||||
<i class="fas fa-moon dark:hidden text-xl"></i>
|
|
||||||
<i class="fas fa-sun hidden dark:inline text-xl"></i>
|
|
||||||
</button>
|
|
||||||
<a href="https://github.com/lukaszraczylo/homebrew-taps" target="_blank" class="text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-gray-100 p-2 min-w-[44px] min-h-[44px] flex items-center justify-center" aria-label="View on GitHub">
|
|
||||||
<i class="fab fa-github text-xl"></i>
|
|
||||||
</a>
|
|
||||||
<button id="mobile-menu-toggle" class="md:hidden text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-gray-100 p-2 min-w-[44px] min-h-[44px] flex items-center justify-center" aria-label="Toggle menu">
|
|
||||||
<i class="fas fa-bars text-xl" id="menu-open-icon"></i>
|
|
||||||
<i class="fas fa-times text-xl hidden" id="menu-close-icon"></i>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div id="mobile-menu" class="hidden md:hidden border-t border-gray-200 dark:border-gray-700">
|
|
||||||
<div class="px-4 py-3 space-y-1 bg-white dark:bg-gray-800">
|
|
||||||
<a href="#casks" class="block px-3 py-3 text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-gray-100 hover:bg-gray-50 dark:hover:bg-gray-700 rounded font-medium">Available Casks</a>
|
|
||||||
<a href="#installation" class="block px-3 py-3 text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-gray-100 hover:bg-gray-50 dark:hover:bg-gray-700 rounded font-medium">Installation</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<!-- Hero Section -->
|
|
||||||
<section class="relative pt-24 sm:pt-32 pb-12 sm:pb-20 overflow-hidden">
|
|
||||||
<div class="absolute inset-0 bg-gradient-to-br from-emerald-50 via-blue-50 to-purple-50 dark:from-gray-900 dark:via-emerald-900/20 dark:to-blue-900/20 theme-transition"></div>
|
|
||||||
<div class="absolute top-0 -left-4 w-72 h-72 bg-emerald-300 dark:bg-emerald-500 rounded-full mix-blend-multiply dark:mix-blend-soft-light filter blur-xl opacity-20 animate-float"></div>
|
|
||||||
<div class="absolute top-0 -right-4 w-72 h-72 bg-blue-300 dark:bg-blue-500 rounded-full mix-blend-multiply dark:mix-blend-soft-light filter blur-xl opacity-20 animate-float" style="animation-delay: 1s;"></div>
|
|
||||||
<div class="absolute -bottom-8 left-20 w-72 h-72 bg-purple-300 dark:bg-purple-500 rounded-full mix-blend-multiply dark:mix-blend-soft-light filter blur-xl opacity-20 animate-float" style="animation-delay: 2s;"></div>
|
|
||||||
|
|
||||||
<div class="relative max-w-6xl mx-auto px-4 sm:px-6">
|
|
||||||
<div class="text-center">
|
|
||||||
<div class="mb-8 sm:mb-10 flex justify-center animate-fade-in-up">
|
|
||||||
<i class="fas fa-beer text-8xl sm:text-9xl text-amber-500 animate-float"></i>
|
|
||||||
</div>
|
</div>
|
||||||
<h1 class="text-3xl sm:text-4xl md:text-5xl lg:text-6xl font-bold text-gray-900 dark:text-gray-100 mb-4 sm:mb-6 leading-tight animate-fade-in-up" style="animation-delay: 0.1s;">
|
</header>
|
||||||
Homebrew Tap<br /><span class="gradient-text">at raczylo.com</span>
|
|
||||||
</h1>
|
<main class="wrap">
|
||||||
<p class="text-base sm:text-lg md:text-xl text-gray-600 dark:text-gray-300 mb-8 sm:mb-10 max-w-2xl mx-auto leading-relaxed px-4 animate-fade-in-up" style="animation-delay: 0.2s;">
|
<div class="intro">
|
||||||
Developer tools for macOS and Linux. Install powerful CLI utilities with a single command.
|
<h1>Homebrew tap for the command-line tools at raczylo.com</h1>
|
||||||
|
<p>
|
||||||
|
Prebuilt binaries for macOS and Linux, on arm64 and amd64. Tap once, then install any project
|
||||||
|
below as a cask.
|
||||||
</p>
|
</p>
|
||||||
<div class="flex flex-col sm:flex-row gap-3 sm:gap-4 justify-center mb-8 sm:mb-12 px-4 animate-fade-in-up" style="animation-delay: 0.3s;">
|
<div class="cmd">
|
||||||
<a href="#installation" class="group relative bg-gradient-to-r from-emerald-500 to-blue-600 hover:from-emerald-600 hover:to-blue-700 text-white px-8 py-3 rounded-lg font-medium transition-all duration-300 min-h-[48px] flex items-center justify-center shadow-lg hover:shadow-xl hover:scale-105">
|
<pre><code>brew tap lukaszraczylo/taps</code></pre>
|
||||||
<span class="relative z-10">Get Started</span>
|
<button class="copy-btn" type="button" onclick="copyCode(this)">Copy</button>
|
||||||
</a>
|
|
||||||
<a href="https://github.com/lukaszraczylo/homebrew-taps" class="group glass hover:shadow-lg text-gray-900 dark:text-gray-100 px-8 py-3 rounded-lg font-medium transition-all duration-300 min-h-[48px] flex items-center justify-center hover:scale-105">
|
|
||||||
<i class="fab fa-github mr-2"></i>View on GitHub
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<!-- Available Casks Section -->
|
<section id="projects">
|
||||||
<section id="casks" class="py-12 sm:py-16 md:py-20 bg-white dark:bg-gray-900 theme-transition">
|
<h2>Projects <small>installed with <code>brew install --cask</code></small></h2>
|
||||||
<div class="max-w-6xl mx-auto px-4 sm:px-6">
|
<ul class="projects">
|
||||||
<div class="text-center mb-8 sm:mb-12">
|
|
||||||
<h2 class="text-2xl sm:text-3xl md:text-4xl font-bold text-gray-900 dark:text-gray-100 mb-3 sm:mb-4">Available Casks</h2>
|
|
||||||
<p class="text-base sm:text-lg text-gray-600 dark:text-gray-300 px-4">Install any of these tools with Homebrew</p>
|
|
||||||
</div>
|
|
||||||
<div class="grid md:grid-cols-2 lg:grid-cols-3 gap-6" id="casks-container">
|
|
||||||
<!-- CASKS_START -->
|
<!-- CASKS_START -->
|
||||||
|
|
||||||
<!-- harness-sync -->
|
<!-- harness-sync -->
|
||||||
<div class="glass p-6 rounded-xl group hover:shadow-lg transition-all duration-300">
|
<li class="project">
|
||||||
<div class="flex items-start gap-4 mb-4">
|
<div class="project-head">
|
||||||
<div class="w-12 h-12 rounded-xl bg-gradient-to-br from-gray-500 to-gray-600 flex items-center justify-center flex-shrink-0 group-hover:scale-110 transition-transform duration-300">
|
<h3>harness-sync</h3>
|
||||||
<i class="fas fa-cube text-white text-lg"></i>
|
<span class="meta">v0.31.5 · LLM</span>
|
||||||
</div>
|
<span class="project-links">
|
||||||
<div class="flex-1">
|
<a href="https://github.com/lukaszraczylo/harness-sync">GitHub</a>
|
||||||
<h3 class="font-bold text-gray-900 dark:text-gray-100 text-lg">harness-sync</h3>
|
</span>
|
||||||
<span class="text-xs text-gray-500 dark:text-gray-400">v0.31.5</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<p class="text-sm text-gray-600 dark:text-gray-400 mb-4">Sync skills, agents, MCP, and LLM endpoints across multiple LLM harnesses</p>
|
|
||||||
<div class="flex flex-wrap gap-2 mb-4">
|
|
||||||
<span class="px-2 py-1 bg-gray-100 dark:bg-gray-900/30 text-gray-700 dark:text-gray-300 rounded text-xs">CLI</span>
|
|
||||||
</div>
|
|
||||||
<div class="flex gap-2">
|
|
||||||
<a href="https://github.com/lukaszraczylo/harness-sync" target="_blank" class="flex-1 text-center px-3 py-2 bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700 rounded-lg text-sm font-medium transition-colors">
|
|
||||||
<i class="fab fa-github mr-1"></i>GitHub
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="code-block mt-4">
|
|
||||||
<pre class="bg-gray-900 text-gray-100 p-3 pr-16 rounded-lg text-xs overflow-x-auto"><code>brew install --cask lukaszraczylo/taps/harness-sync</code></pre>
|
|
||||||
<button class="copy-btn" onclick="copyCode(this)" title="Copy to clipboard"><i class="fas fa-copy"></i></button>
|
|
||||||
</div>
|
</div>
|
||||||
|
<p>Sync skills, agents, MCP, and LLM endpoints across multiple LLM harnesses</p>
|
||||||
|
<div class="cmd">
|
||||||
|
<pre><code>brew install --cask lukaszraczylo/taps/harness-sync</code></pre>
|
||||||
|
<button class="copy-btn" type="button" onclick="copyCode(this)">Copy</button>
|
||||||
</div>
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
<!-- kportal -->
|
<!-- kportal -->
|
||||||
<div class="glass p-6 rounded-xl group hover:shadow-lg transition-all duration-300">
|
<li class="project">
|
||||||
<div class="flex items-start gap-4 mb-4">
|
<div class="project-head">
|
||||||
<div class="w-12 h-12 rounded-xl bg-gradient-to-br from-blue-500 to-purple-600 flex items-center justify-center flex-shrink-0 group-hover:scale-110 transition-transform duration-300">
|
<h3>kportal</h3>
|
||||||
<i class="fas fa-ship text-white text-lg"></i>
|
<span class="meta">v0.13.2 · Kubernetes</span>
|
||||||
</div>
|
<span class="project-links">
|
||||||
<div class="flex-1">
|
<a href="https://kportal.raczylo.com">Docs</a>
|
||||||
<h3 class="font-bold text-gray-900 dark:text-gray-100 text-lg">kportal</h3>
|
<a href="https://github.com/lukaszraczylo/kportal">GitHub</a>
|
||||||
<span class="text-xs text-gray-500 dark:text-gray-400">v0.13.2</span>
|
</span>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<p class="text-sm text-gray-600 dark:text-gray-400 mb-4">Modern Kubernetes port-forward manager with interactive TUI</p>
|
|
||||||
<div class="flex flex-wrap gap-2 mb-4">
|
|
||||||
<span class="px-2 py-1 bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 rounded text-xs">Kubernetes</span>
|
|
||||||
<span class="px-2 py-1 bg-purple-100 dark:bg-purple-900/30 text-purple-700 dark:text-purple-300 rounded text-xs">TUI</span>
|
|
||||||
</div>
|
|
||||||
<div class="flex gap-2">
|
|
||||||
<a href="https://kportal.raczylo.com" target="_blank" class="flex-1 text-center px-3 py-2 bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700 rounded-lg text-sm font-medium transition-colors">
|
|
||||||
<i class="fas fa-book mr-1"></i>Docs
|
|
||||||
</a>
|
|
||||||
<a href="https://github.com/lukaszraczylo/kportal" target="_blank" class="flex-1 text-center px-3 py-2 bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700 rounded-lg text-sm font-medium transition-colors">
|
|
||||||
<i class="fab fa-github mr-1"></i>GitHub
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="code-block mt-4">
|
|
||||||
<pre class="bg-gray-900 text-gray-100 p-3 pr-16 rounded-lg text-xs overflow-x-auto"><code>brew install --cask lukaszraczylo/taps/kportal</code></pre>
|
|
||||||
<button class="copy-btn" onclick="copyCode(this)" title="Copy to clipboard"><i class="fas fa-copy"></i></button>
|
|
||||||
</div>
|
</div>
|
||||||
|
<p>Modern Kubernetes port-forward manager with interactive TUI</p>
|
||||||
|
<div class="cmd">
|
||||||
|
<pre><code>brew install --cask lukaszraczylo/taps/kportal</code></pre>
|
||||||
|
<button class="copy-btn" type="button" onclick="copyCode(this)">Copy</button>
|
||||||
</div>
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
<!-- lolcathost -->
|
<!-- lolcathost -->
|
||||||
<div class="glass p-6 rounded-xl group hover:shadow-lg transition-all duration-300">
|
<li class="project">
|
||||||
<div class="flex items-start gap-4 mb-4">
|
<div class="project-head">
|
||||||
<div class="w-12 h-12 rounded-xl bg-gradient-to-br from-pink-500 to-purple-600 flex items-center justify-center flex-shrink-0 group-hover:scale-110 transition-transform duration-300">
|
<h3>lolcathost</h3>
|
||||||
<i class="fas fa-cat text-white text-lg"></i>
|
<span class="meta">v0.2.21 · Hosts</span>
|
||||||
</div>
|
<span class="project-links">
|
||||||
<div class="flex-1">
|
<a href="https://lolcathost.raczylo.com">Docs</a>
|
||||||
<h3 class="font-bold text-gray-900 dark:text-gray-100 text-lg">lolcathost</h3>
|
<a href="https://github.com/lukaszraczylo/lolcathost">GitHub</a>
|
||||||
<span class="text-xs text-gray-500 dark:text-gray-400">v0.2.21</span>
|
</span>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<p class="text-sm text-gray-600 dark:text-gray-400 mb-4">Dynamic host management tool with TUI</p>
|
|
||||||
<div class="flex flex-wrap gap-2 mb-4">
|
|
||||||
<span class="px-2 py-1 bg-pink-100 dark:bg-pink-900/30 text-pink-700 dark:text-pink-300 rounded text-xs">Hosts</span>
|
|
||||||
<span class="px-2 py-1 bg-purple-100 dark:bg-purple-900/30 text-purple-700 dark:text-purple-300 rounded text-xs">TUI</span>
|
|
||||||
</div>
|
|
||||||
<div class="flex gap-2">
|
|
||||||
<a href="https://lolcathost.raczylo.com" target="_blank" class="flex-1 text-center px-3 py-2 bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700 rounded-lg text-sm font-medium transition-colors">
|
|
||||||
<i class="fas fa-book mr-1"></i>Docs
|
|
||||||
</a>
|
|
||||||
<a href="https://github.com/lukaszraczylo/lolcathost" target="_blank" class="flex-1 text-center px-3 py-2 bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700 rounded-lg text-sm font-medium transition-colors">
|
|
||||||
<i class="fab fa-github mr-1"></i>GitHub
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="code-block mt-4">
|
|
||||||
<pre class="bg-gray-900 text-gray-100 p-3 pr-16 rounded-lg text-xs overflow-x-auto"><code>brew install --cask lukaszraczylo/taps/lolcathost</code></pre>
|
|
||||||
<button class="copy-btn" onclick="copyCode(this)" title="Copy to clipboard"><i class="fas fa-copy"></i></button>
|
|
||||||
</div>
|
</div>
|
||||||
|
<p>Dynamic host management tool with TUI</p>
|
||||||
|
<div class="cmd">
|
||||||
|
<pre><code>brew install --cask lukaszraczylo/taps/lolcathost</code></pre>
|
||||||
|
<button class="copy-btn" type="button" onclick="copyCode(this)">Copy</button>
|
||||||
</div>
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
<!-- semver-generator -->
|
<!-- semver-generator -->
|
||||||
<div class="glass p-6 rounded-xl group hover:shadow-lg transition-all duration-300">
|
<li class="project">
|
||||||
<div class="flex items-start gap-4 mb-4">
|
<div class="project-head">
|
||||||
<div class="w-12 h-12 rounded-xl bg-gradient-to-br from-emerald-500 to-teal-600 flex items-center justify-center flex-shrink-0 group-hover:scale-110 transition-transform duration-300">
|
<h3>semver-generator</h3>
|
||||||
<i class="fas fa-code-branch text-white text-lg"></i>
|
<span class="meta">v1.18.11 · Git</span>
|
||||||
</div>
|
<span class="project-links">
|
||||||
<div class="flex-1">
|
<a href="https://github.com/lukaszraczylo/semver-generator">GitHub</a>
|
||||||
<h3 class="font-bold text-gray-900 dark:text-gray-100 text-lg">semver-generator</h3>
|
</span>
|
||||||
<span class="text-xs text-gray-500 dark:text-gray-400">v1.18.11</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<p class="text-sm text-gray-600 dark:text-gray-400 mb-4">Automatic semantic version generator based on git commit messages</p>
|
|
||||||
<div class="flex flex-wrap gap-2 mb-4">
|
|
||||||
<span class="px-2 py-1 bg-emerald-100 dark:bg-emerald-900/30 text-emerald-700 dark:text-emerald-300 rounded text-xs">Git</span>
|
|
||||||
<span class="px-2 py-1 bg-teal-100 dark:bg-teal-900/30 text-teal-700 dark:text-teal-300 rounded text-xs">Versioning</span>
|
|
||||||
</div>
|
|
||||||
<div class="flex gap-2">
|
|
||||||
<a href="https://github.com/lukaszraczylo/semver-generator" target="_blank" class="flex-1 text-center px-3 py-2 bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700 rounded-lg text-sm font-medium transition-colors">
|
|
||||||
<i class="fab fa-github mr-1"></i>GitHub
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="code-block mt-4">
|
|
||||||
<pre class="bg-gray-900 text-gray-100 p-3 pr-16 rounded-lg text-xs overflow-x-auto"><code>brew install --cask lukaszraczylo/taps/semver-generator</code></pre>
|
|
||||||
<button class="copy-btn" onclick="copyCode(this)" title="Copy to clipboard"><i class="fas fa-copy"></i></button>
|
|
||||||
</div>
|
</div>
|
||||||
|
<p>Automatic semantic version generator based on git commit messages</p>
|
||||||
|
<div class="cmd">
|
||||||
|
<pre><code>brew install --cask lukaszraczylo/taps/semver-generator</code></pre>
|
||||||
|
<button class="copy-btn" type="button" onclick="copyCode(this)">Copy</button>
|
||||||
</div>
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
<!-- CASKS_END -->
|
<!-- CASKS_END -->
|
||||||
</div>
|
</ul>
|
||||||
</div>
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<!-- Installation Section -->
|
<section id="install">
|
||||||
<section id="installation" class="py-12 sm:py-16 md:py-20 bg-gray-50 dark:bg-gray-800 theme-transition">
|
<h2>Install</h2>
|
||||||
<div class="max-w-6xl mx-auto px-4 sm:px-6">
|
<p class="note">Install a project by name. Homebrew taps the repository on first use.</p>
|
||||||
<div class="text-center mb-8 sm:mb-12">
|
<div class="cmd">
|
||||||
<h2 class="text-2xl sm:text-3xl md:text-4xl font-bold text-gray-900 dark:text-gray-100 mb-3 sm:mb-4">Installation</h2>
|
<pre><code>brew install --cask lukaszraczylo/taps/<name></code></pre>
|
||||||
<p class="text-base sm:text-lg text-gray-600 dark:text-gray-300 px-4">Get started in seconds</p>
|
<button class="copy-btn" type="button" onclick="copyCode(this)">Copy</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="max-w-3xl mx-auto space-y-6">
|
<p class="note">Or declare the tap in a Brewfile:</p>
|
||||||
<div class="glass p-6 rounded-xl">
|
<div class="cmd">
|
||||||
<h3 class="font-semibold text-gray-900 dark:text-gray-100 mb-3 flex items-center">
|
<pre><code>tap "lukaszraczylo/taps"
|
||||||
<i class="fas fa-plus-circle mr-2 text-emerald-500"></i>
|
<!-- BREWFILE_START -->
|
||||||
Add the Tap
|
cask "harness-sync"
|
||||||
</h3>
|
|
||||||
<div class="code-block">
|
|
||||||
<pre class="bg-gray-900 text-gray-100 p-4 pr-20 rounded-lg overflow-x-auto"><code>brew tap lukaszraczylo/taps</code></pre>
|
|
||||||
<button class="copy-btn" onclick="copyCode(this)" title="Copy to clipboard"><i class="fas fa-copy"></i></button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="glass p-6 rounded-xl">
|
|
||||||
<h3 class="font-semibold text-gray-900 dark:text-gray-100 mb-3 flex items-center">
|
|
||||||
<i class="fas fa-download mr-2 text-blue-500"></i>
|
|
||||||
Install a Cask
|
|
||||||
</h3>
|
|
||||||
<div class="code-block">
|
|
||||||
<pre class="bg-gray-900 text-gray-100 p-4 pr-20 rounded-lg overflow-x-auto"><code>brew install --cask lukaszraczylo/taps/<cask-name></code></pre>
|
|
||||||
<button class="copy-btn" onclick="copyCode(this)" title="Copy to clipboard"><i class="fas fa-copy"></i></button>
|
|
||||||
</div>
|
|
||||||
<p class="text-sm text-gray-600 dark:text-gray-400 mt-3">Or install directly without tapping first:</p>
|
|
||||||
<div class="code-block mt-2">
|
|
||||||
<pre class="bg-gray-900 text-gray-100 p-4 pr-20 rounded-lg overflow-x-auto"><code>brew install --cask lukaszraczylo/taps/kportal</code></pre>
|
|
||||||
<button class="copy-btn" onclick="copyCode(this)" title="Copy to clipboard"><i class="fas fa-copy"></i></button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="glass p-6 rounded-xl">
|
|
||||||
<h3 class="font-semibold text-gray-900 dark:text-gray-100 mb-3 flex items-center">
|
|
||||||
<i class="fas fa-file-code mr-2 text-purple-500"></i>
|
|
||||||
Using Brewfile
|
|
||||||
</h3>
|
|
||||||
<p class="text-gray-600 dark:text-gray-400 mb-3">Add to your Brewfile:</p>
|
|
||||||
<div class="code-block">
|
|
||||||
<pre class="bg-gray-900 text-gray-100 p-4 pr-20 rounded-lg overflow-x-auto"><code>tap "lukaszraczylo/taps"
|
|
||||||
cask "kportal"
|
cask "kportal"
|
||||||
cask "lolcathost"
|
cask "lolcathost"
|
||||||
cask "semver-generator"</code></pre>
|
cask "semver-generator"
|
||||||
<button class="copy-btn" onclick="copyCode(this)" title="Copy to clipboard"><i class="fas fa-copy"></i></button>
|
<!-- BREWFILE_END --></code></pre>
|
||||||
</div>
|
<button class="copy-btn" type="button" onclick="copyCode(this)">Copy</button>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
</main>
|
||||||
|
|
||||||
<!-- Footer -->
|
<footer>
|
||||||
<footer class="py-8 bg-white dark:bg-gray-900 border-t border-gray-200 dark:border-gray-800 theme-transition">
|
<div class="wrap">
|
||||||
<div class="max-w-6xl mx-auto px-4 sm:px-6">
|
<span>MIT License</span>
|
||||||
<div class="flex flex-col md:flex-row justify-between items-center gap-4">
|
<span>
|
||||||
<div class="flex items-center gap-2">
|
<a href="https://github.com/lukaszraczylo/homebrew-taps">Source</a>
|
||||||
<i class="fas fa-beer text-2xl text-amber-500"></i>
|
<a href="https://github.com/lukaszraczylo/homebrew-taps/issues">Issues</a>
|
||||||
<span class="text-xl font-bold gradient-text">brew-taps</span>
|
<a href="https://docs.brew.sh">Homebrew docs</a>
|
||||||
</div>
|
</span>
|
||||||
<div class="flex items-center space-x-6">
|
|
||||||
<a href="https://github.com/lukaszraczylo/homebrew-taps" class="text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100">
|
|
||||||
<i class="fab fa-github text-xl"></i>
|
|
||||||
</a>
|
|
||||||
<a href="https://github.com/lukaszraczylo/homebrew-taps/issues" class="text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100 text-sm">Issues</a>
|
|
||||||
</div>
|
|
||||||
<p class="text-gray-500 dark:text-gray-400 text-sm">MIT License</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
// Copy code to clipboard
|
|
||||||
function copyCode(button) {
|
function copyCode(button) {
|
||||||
const codeBlock = button.parentElement.querySelector('code');
|
var text = button.parentElement.querySelector("code").textContent;
|
||||||
const text = codeBlock.textContent;
|
navigator.clipboard.writeText(text).then(
|
||||||
|
function () {
|
||||||
navigator.clipboard.writeText(text).then(() => {
|
button.classList.add("copied");
|
||||||
button.classList.add('copied');
|
button.textContent = "Copied";
|
||||||
button.innerHTML = '<i class="fas fa-check"></i>';
|
setTimeout(function () {
|
||||||
|
button.classList.remove("copied");
|
||||||
setTimeout(() => {
|
button.textContent = "Copy";
|
||||||
button.classList.remove('copied');
|
|
||||||
button.innerHTML = '<i class="fas fa-copy"></i>';
|
|
||||||
}, 2000);
|
}, 2000);
|
||||||
}).catch(err => {
|
},
|
||||||
console.error('Failed to copy:', err);
|
function (err) {
|
||||||
});
|
console.error("Copy failed:", err);
|
||||||
}
|
}
|
||||||
|
);
|
||||||
// Theme toggle
|
|
||||||
document.getElementById('theme-toggle').addEventListener('click', function() {
|
|
||||||
if (document.documentElement.classList.contains('dark')) {
|
|
||||||
document.documentElement.classList.remove('dark');
|
|
||||||
localStorage.theme = 'light';
|
|
||||||
} else {
|
|
||||||
document.documentElement.classList.add('dark');
|
|
||||||
localStorage.theme = 'dark';
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
// Mobile menu toggle
|
|
||||||
document.getElementById('mobile-menu-toggle').addEventListener('click', function() {
|
|
||||||
const menu = document.getElementById('mobile-menu');
|
|
||||||
const openIcon = document.getElementById('menu-open-icon');
|
|
||||||
const closeIcon = document.getElementById('menu-close-icon');
|
|
||||||
|
|
||||||
menu.classList.toggle('hidden');
|
|
||||||
openIcon.classList.toggle('hidden');
|
|
||||||
closeIcon.classList.toggle('hidden');
|
|
||||||
});
|
|
||||||
|
|
||||||
// Close mobile menu on link click
|
|
||||||
document.querySelectorAll('#mobile-menu a').forEach(link => {
|
|
||||||
link.addEventListener('click', function() {
|
|
||||||
document.getElementById('mobile-menu').classList.add('hidden');
|
|
||||||
document.getElementById('menu-open-icon').classList.remove('hidden');
|
|
||||||
document.getElementById('menu-close-icon').classList.add('hidden');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+55
-113
@@ -11,144 +11,84 @@ CASKS_DIR="${ROOT_DIR}/Casks"
|
|||||||
DOCS_DIR="${ROOT_DIR}/docs"
|
DOCS_DIR="${ROOT_DIR}/docs"
|
||||||
INDEX_FILE="${DOCS_DIR}/index.html"
|
INDEX_FILE="${DOCS_DIR}/index.html"
|
||||||
TEMP_FILE="${DOCS_DIR}/casks_temp.html"
|
TEMP_FILE="${DOCS_DIR}/casks_temp.html"
|
||||||
|
BREWFILE_TEMP="${DOCS_DIR}/brewfile_temp.txt"
|
||||||
|
|
||||||
# Get metadata for a cask
|
# Per-cask metadata: category label and optional docs site
|
||||||
get_icon() {
|
get_category() {
|
||||||
case "$1" in
|
|
||||||
kportal) echo "fa-ship" ;;
|
|
||||||
lolcathost) echo "fa-cat" ;;
|
|
||||||
semver-generator) echo "fa-code-branch" ;;
|
|
||||||
graphql-monitoring-proxy) echo "fa-chart-line" ;;
|
|
||||||
*) echo "fa-cube" ;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
get_colors() {
|
|
||||||
case "$1" in
|
|
||||||
kportal) echo "from-blue-500 to-purple-600" ;;
|
|
||||||
lolcathost) echo "from-pink-500 to-purple-600" ;;
|
|
||||||
semver-generator) echo "from-emerald-500 to-teal-600" ;;
|
|
||||||
graphql-monitoring-proxy) echo "from-rose-500 to-orange-600" ;;
|
|
||||||
*) echo "from-gray-500 to-gray-600" ;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
get_tag1() {
|
|
||||||
case "$1" in
|
case "$1" in
|
||||||
kportal) echo "Kubernetes" ;;
|
kportal) echo "Kubernetes" ;;
|
||||||
lolcathost) echo "Hosts" ;;
|
lolcathost) echo "Hosts" ;;
|
||||||
semver-generator) echo "Git" ;;
|
semver-generator) echo "Git" ;;
|
||||||
graphql-monitoring-proxy) echo "GraphQL" ;;
|
harness-sync) echo "LLM" ;;
|
||||||
|
readitall) echo "MCP" ;;
|
||||||
|
mcp-filepuff) echo "MCP" ;;
|
||||||
*) echo "CLI" ;;
|
*) echo "CLI" ;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
get_tag1_color() {
|
|
||||||
case "$1" in
|
|
||||||
kportal) echo "blue" ;;
|
|
||||||
lolcathost) echo "pink" ;;
|
|
||||||
semver-generator) echo "emerald" ;;
|
|
||||||
graphql-monitoring-proxy) echo "rose" ;;
|
|
||||||
*) echo "gray" ;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
get_tag2() {
|
|
||||||
case "$1" in
|
|
||||||
kportal) echo "TUI" ;;
|
|
||||||
lolcathost) echo "TUI" ;;
|
|
||||||
semver-generator) echo "Versioning" ;;
|
|
||||||
graphql-monitoring-proxy) echo "Monitoring" ;;
|
|
||||||
*) echo "" ;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
get_tag2_color() {
|
|
||||||
case "$1" in
|
|
||||||
kportal) echo "purple" ;;
|
|
||||||
lolcathost) echo "purple" ;;
|
|
||||||
semver-generator) echo "teal" ;;
|
|
||||||
graphql-monitoring-proxy) echo "orange" ;;
|
|
||||||
*) echo "gray" ;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
get_docs_url() {
|
get_docs_url() {
|
||||||
case "$1" in
|
case "$1" in
|
||||||
kportal) echo "https://kportal.raczylo.com" ;;
|
kportal) echo "https://kportal.raczylo.com" ;;
|
||||||
lolcathost) echo "https://lolcathost.raczylo.com" ;;
|
lolcathost) echo "https://lolcathost.raczylo.com" ;;
|
||||||
graphql-monitoring-proxy) echo "https://graphql-monitoring-proxy.raczylo.com" ;;
|
|
||||||
*) echo "" ;;
|
*) echo "" ;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Cask name differs from the GitHub repository name for some projects
|
||||||
|
get_repo() {
|
||||||
|
case "$1" in
|
||||||
|
readitall) echo "mcp-readitall" ;;
|
||||||
|
mcp-filepuff) echo "filepuff-mcp" ;;
|
||||||
|
*) echo "$1" ;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
html_escape() {
|
||||||
|
local s="$1"
|
||||||
|
s="${s//&/&}"
|
||||||
|
s="${s//</<}"
|
||||||
|
s="${s//>/>}"
|
||||||
|
echo "${s}"
|
||||||
|
}
|
||||||
|
|
||||||
generate_cask_card() {
|
generate_cask_card() {
|
||||||
local name="$1"
|
local name="$1"
|
||||||
local version="$2"
|
local version="$2"
|
||||||
local desc="$3"
|
local desc
|
||||||
|
desc=$(html_escape "$3")
|
||||||
|
|
||||||
local icon
|
local category
|
||||||
icon=$(get_icon "${name}")
|
category=$(get_category "${name}")
|
||||||
local colors
|
|
||||||
colors=$(get_colors "${name}")
|
|
||||||
local tag1
|
|
||||||
tag1=$(get_tag1 "${name}")
|
|
||||||
local tag1_color
|
|
||||||
tag1_color=$(get_tag1_color "${name}")
|
|
||||||
local tag2
|
|
||||||
tag2=$(get_tag2 "${name}")
|
|
||||||
local tag2_color
|
|
||||||
tag2_color=$(get_tag2_color "${name}")
|
|
||||||
local docs_url
|
local docs_url
|
||||||
docs_url=$(get_docs_url "${name}")
|
docs_url=$(get_docs_url "${name}")
|
||||||
local github_url="https://github.com/lukaszraczylo/${name}"
|
local repo
|
||||||
|
repo=$(get_repo "${name}")
|
||||||
|
local github_url="https://github.com/lukaszraczylo/${repo}"
|
||||||
|
|
||||||
local tags_html="<span class=\"px-2 py-1 bg-${tag1_color}-100 dark:bg-${tag1_color}-900/30 text-${tag1_color}-700 dark:text-${tag1_color}-300 rounded text-xs\">${tag1}</span>"
|
local links_html=""
|
||||||
if [[ -n "${tag2}" ]]
|
|
||||||
then
|
|
||||||
tags_html="${tags_html}
|
|
||||||
<span class=\"px-2 py-1 bg-${tag2_color}-100 dark:bg-${tag2_color}-900/30 text-${tag2_color}-700 dark:text-${tag2_color}-300 rounded text-xs\">${tag2}</span>"
|
|
||||||
fi
|
|
||||||
|
|
||||||
local buttons_html=""
|
|
||||||
if [[ -n "${docs_url}" ]]
|
if [[ -n "${docs_url}" ]]
|
||||||
then
|
then
|
||||||
buttons_html="<a href=\"${docs_url}\" target=\"_blank\" class=\"flex-1 text-center px-3 py-2 bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700 rounded-lg text-sm font-medium transition-colors\">
|
links_html="<a href=\"${docs_url}\">Docs</a>
|
||||||
<i class=\"fas fa-book mr-1\"></i>Docs
|
"
|
||||||
</a>
|
|
||||||
<a href=\"${github_url}\" target=\"_blank\" class=\"flex-1 text-center px-3 py-2 bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700 rounded-lg text-sm font-medium transition-colors\">
|
|
||||||
<i class=\"fab fa-github mr-1\"></i>GitHub
|
|
||||||
</a>"
|
|
||||||
else
|
|
||||||
buttons_html="<a href=\"${github_url}\" target=\"_blank\" class=\"flex-1 text-center px-3 py-2 bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700 rounded-lg text-sm font-medium transition-colors\">
|
|
||||||
<i class=\"fab fa-github mr-1\"></i>GitHub
|
|
||||||
</a>"
|
|
||||||
fi
|
fi
|
||||||
|
links_html="${links_html}<a href=\"${github_url}\">GitHub</a>"
|
||||||
|
|
||||||
cat <<CARD_EOF
|
cat <<CARD_EOF
|
||||||
<!-- ${name} -->
|
<!-- ${name} -->
|
||||||
<div class="glass p-6 rounded-xl group hover:shadow-lg transition-all duration-300">
|
<li class="project">
|
||||||
<div class="flex items-start gap-4 mb-4">
|
<div class="project-head">
|
||||||
<div class="w-12 h-12 rounded-xl bg-gradient-to-br ${colors} flex items-center justify-center flex-shrink-0 group-hover:scale-110 transition-transform duration-300">
|
<h3>${name}</h3>
|
||||||
<i class="fas ${icon} text-white text-lg"></i>
|
<span class="meta">v${version} · ${category}</span>
|
||||||
</div>
|
<span class="project-links">
|
||||||
<div class="flex-1">
|
${links_html}
|
||||||
<h3 class="font-bold text-gray-900 dark:text-gray-100 text-lg">${name}</h3>
|
</span>
|
||||||
<span class="text-xs text-gray-500 dark:text-gray-400">v${version}</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<p class="text-sm text-gray-600 dark:text-gray-400 mb-4">${desc}</p>
|
|
||||||
<div class="flex flex-wrap gap-2 mb-4">
|
|
||||||
${tags_html}
|
|
||||||
</div>
|
|
||||||
<div class="flex gap-2">
|
|
||||||
${buttons_html}
|
|
||||||
</div>
|
|
||||||
<div class="code-block mt-4">
|
|
||||||
<pre class="bg-gray-900 text-gray-100 p-3 pr-16 rounded-lg text-xs overflow-x-auto"><code>brew install --cask lukaszraczylo/taps/${name}</code></pre>
|
|
||||||
<button class="copy-btn" onclick="copyCode(this)" title="Copy to clipboard"><i class="fas fa-copy"></i></button>
|
|
||||||
</div>
|
</div>
|
||||||
|
<p>${desc}</p>
|
||||||
|
<div class="cmd">
|
||||||
|
<pre><code>brew install --cask lukaszraczylo/taps/${name}</code></pre>
|
||||||
|
<button class="copy-btn" type="button" onclick="copyCode(this)">Copy</button>
|
||||||
</div>
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
CARD_EOF
|
CARD_EOF
|
||||||
}
|
}
|
||||||
@@ -164,6 +104,7 @@ fi
|
|||||||
|
|
||||||
# Generate casks HTML to temp file
|
# Generate casks HTML to temp file
|
||||||
echo "" >"${TEMP_FILE}"
|
echo "" >"${TEMP_FILE}"
|
||||||
|
: >"${BREWFILE_TEMP}"
|
||||||
|
|
||||||
for cask_file in "${CASKS_DIR}"/*.rb
|
for cask_file in "${CASKS_DIR}"/*.rb
|
||||||
do
|
do
|
||||||
@@ -174,21 +115,22 @@ do
|
|||||||
desc=$(grep -m1 'desc "' "${cask_file}" | sed 's/.*desc "\([^"]*\)".*/\1/' 2>/dev/null || echo "A Homebrew cask")
|
desc=$(grep -m1 'desc "' "${cask_file}" | sed 's/.*desc "\([^"]*\)".*/\1/' 2>/dev/null || echo "A Homebrew cask")
|
||||||
|
|
||||||
generate_cask_card "${name}" "${version}" "${desc}" >>"${TEMP_FILE}"
|
generate_cask_card "${name}" "${version}" "${desc}" >>"${TEMP_FILE}"
|
||||||
|
echo "cask \"${name}\"" >>"${BREWFILE_TEMP}"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
# Now rebuild the index.html with the new casks content
|
# Rebuild index.html: casks between CASKS_* markers, Brewfile lines between BREWFILE_* markers
|
||||||
# Read and process the file
|
|
||||||
{
|
{
|
||||||
# Print everything up to and including CASKS_START
|
|
||||||
sed -n '1,/<!-- CASKS_START -->/p' "${INDEX_FILE}"
|
sed -n '1,/<!-- CASKS_START -->/p' "${INDEX_FILE}"
|
||||||
# Print the generated casks
|
|
||||||
cat "${TEMP_FILE}"
|
cat "${TEMP_FILE}"
|
||||||
# Print everything from CASKS_END onwards
|
|
||||||
sed -n '/<!-- CASKS_END -->/,$p' "${INDEX_FILE}"
|
sed -n '/<!-- CASKS_END -->/,$p' "${INDEX_FILE}"
|
||||||
} >"${INDEX_FILE}.new"
|
} | awk -v bf="${BREWFILE_TEMP}" '
|
||||||
|
/<!-- BREWFILE_START -->/ { print; while ((getline line < bf) > 0) print line; skip = 1; next }
|
||||||
|
/<!-- BREWFILE_END -->/ { skip = 0 }
|
||||||
|
!skip { print }
|
||||||
|
' >"${INDEX_FILE}.new"
|
||||||
|
|
||||||
mv "${INDEX_FILE}.new" "${INDEX_FILE}"
|
mv "${INDEX_FILE}.new" "${INDEX_FILE}"
|
||||||
rm -f "${TEMP_FILE}"
|
rm -f "${TEMP_FILE}" "${BREWFILE_TEMP}"
|
||||||
|
|
||||||
echo "Documentation updated successfully!"
|
echo "Documentation updated successfully!"
|
||||||
|
|||||||
Reference in New Issue
Block a user