/components:version-badge
Implement a version badge component that displays version number, git commit, and recent changelog in a tooltip.
Context
- Framework config:!
find. -maxdepth 1 \(-name "next.config.*" -o -name "nuxt.config.*" -o -name "svelte.config.*" -o -name "vite.config.*" \) - Package manager:!
find. -maxdepth 1 \(-name "package.json" -o -name "bun.lockb" -o -name "pnpm-lock.yaml" \) - Styling:!
find. -maxdepth 1 \(-name "tailwind.config.*" -o -name "postcss.config.*" \) - UI library:!
find. -maxdepth 1 -name "components.json" - Changelog:!
find. -maxdepth 1 -name \'CHANGELOG.md\' - Version:!
jq -r '.version // "unknown"' package.json
Parameters
--check-only: Analyze project and show what would be implemented without making changes--location <header|footer|custom>: Specify component placement (default: header)
Overview
This command adds a version display to your application with:
- Trigger element:
v1.43.0 | 004ddd9(version + abbreviated commit) - Tooltip: Full build info (version, commit, timestamp, branch) + recent changelog entries
- Build-time processing: Zero runtime overhead
Tech Stack Detection
Detect the project's tech stack from the context above:
- Framework:
- Next.js: next.config.js or next.config.mjs or next.config.ts - Nuxt: nuxt.config.ts or nuxt.config.js - SvelteKit: svelte.config.js - Vite + React: vite.config.* + React in dependencies - Vite + Vue: vite.config.* + Vue in dependencies - Create React App: react-scripts in dependencies - Plain React: React in dependencies without specific framework
- Styling:
- Tailwind CSS: tailwind.config.* or @tailwind in CSS - CSS Modules: .module.css files - styled-components: In dependencies - Emotion: @emotion/* in dependencies - Plain CSS: Fallback
- UI Library:
- shadcn/ui: components.json with shadcn config - Radix UI: @radix-ui/* in dependencies - Headless UI: @headlessui/* in dependencies - None: Use native implementation
Execution
Execute this version badge implementation workflow:
Step 1: Analyze project
Read package.json to identify dependencies. Check for framework config files, styling configuration, and existing component patterns.
Step 2: Create changelog parser script
Create a build-time script that parses CHANGELOG.md:
Location: scripts/parse-changelog.mjs (or appropriate location)
// Script should:
// 1. Read CHANGELOG.md
// 2. Extract last 2 versions with their changes
// 3. Categorize changes (feat, fix, perf, breaking)
// 4. Output as JSON for NEXT_PUBLIC_CHANGELOG (or equivalent)Change type icons:
| Type | Icon | Description |
|---|---|---|
| feat | sparkles | New feature |
| fix | bug | Bug fix |
| perf | zap | Performance improvement |
| breaking | warning | Breaking change |
Limits:
- Max 3 features per version
- Max 2 other changes per version
- Last 2 versions only
Step 3: Configure build pipeline
Based on framework, add build-time environment variables:
Next.js (next.config.mjs):
const buildInfo = {
version: process.env.npm_package_version || 'dev',
commit: process.env.VERCEL_GIT_COMMIT_SHA || process.env.GITHUB_SHA || 'local',
branch: process.env.VERCEL_GIT_COMMIT_REF || process.env.GITHUB_REF_NAME || 'local',
buildTime: new Date().toISOString(),
};
export default {
env: {
NEXT_PUBLIC_BUILD_INFO: JSON.stringify(buildInfo),
// NEXT_PUBLIC_CHANGELOG set by parse-changelog.mjs
},
};Vite (vite.config.ts):
export default defineConfig({
define: {
'import.meta.env.VITE_BUILD_INFO': JSON.stringify(buildInfo),
},
});Step 4: Create component
Create the version badge component appropriate for the detected framework:
Component structure:
src/components/
version-badge/
version-badge.tsx # Main component
version-badge.css # Styles (if not using Tailwind)
index.ts # ExportFeatures to implement:
- Trigger display:
- Version number from build info - Abbreviated commit SHA (7 chars) - Subtle styling: text-[10px] text-muted-foreground/60 - Hover brightening for affordance - Hidden when no build info (local dev)
- Tooltip content:
- Build Information section with table layout - Recent Changes section with categorized items - Proper keyboard accessibility
- Accessibility:
- Focusable button trigger - aria-label with version info - Focus ring styling - Both hover and focus trigger tooltip - Screen reader friendly content
Step 5: Integrate component
Add the component to the appropriate location:
Common locations:
- Header/navbar (most common)
- Footer
- Settings page
- About modal
Default: Place below the main title in header, for both desktop and mobile nav.
Component Variants
React + Tailwind + shadcn/ui
Uses Tooltip from shadcn/ui, cn utility for class merging.
React + Tailwind (no UI library)
Native implementation with Radix Tooltip or custom tooltip.
Vue 3 + Tailwind
Vue component with Teleport for tooltip positioning.
Svelte + Tailwind
Svelte component with actions for tooltip behavior.
Plain CSS
Generates CSS with custom properties for theming.
Build Script Template
#!/usr/bin/env node
/**
* parse-changelog.mjs
* Parses CHANGELOG.md and outputs JSON for the version badge tooltip
*/
import { readFileSync, existsSync } from 'fs';
const CHANGELOG_PATH = './CHANGELOG.md';
const MAX_VERSIONS = 2;
const MAX_FEATURES_PER_VERSION = 3;
const MAX_OTHER_PER_VERSION = 2;
function parseChangelog() {
if (!existsSync(CHANGELOG_PATH)) {
return JSON.stringify([]);
}
const content = readFileSync(CHANGELOG_PATH, 'utf-8');
const versions = [];
// Parse version headers and their changes
const versionRegex = /^## \[?(\d+\.\d+\.\d+)\]?/gm;
const changeRegex = /^\* \*\*(\w+):\*\* (.+)$/gm;
// ... parsing logic ...
return JSON.stringify(versions.slice(0, MAX_VERSIONS));
}
// Output for environment variable
console.log(parseChangelog());Flags
| Flag | Description |
|---|---|
--check-only | Analyze project and show what would be implemented |
--location <loc> | Specify component placement (header, footer, custom) |
Examples
# Implement version badge with auto-detection
/components:version-badge
# Check what would be implemented without changes
/components:version-badge --check-only
# Place in footer instead of header
/components:version-badge --location footerPost-Implementation
After implementing:
- Verify build: Run build command to ensure env vars are set
- Test tooltip: Check hover and keyboard accessibility
- Update CI: Ensure changelog is available during build
- Document: Add note to README about version display feature
Error Handling
- No package.json: Warn and ask for framework specification
- Unknown framework: Offer generic implementation or ask user
- No CHANGELOG.md: Component works without changelog, shows only build info
- Existing component: Ask before overwriting, offer merge strategy
See Also
version-badge-patternskill - Detailed pattern documentation