Git state above the prompt: branch, upstream, ahead/behind, Claude vs your changes, PR and CI, worktree, stash; toasts where each commit landed

My Claude Code setup: local mods, skills, and the plugins I run.
Local plugins built with function hooks (panes, bands, guards). Load one with:
claude --plugin-dir mods/<name>
| Mod | What it does |
|---|---|
carousel-ship | After a carousel render: Caption, Queue Threads and Log ledger buttons; blocks Threads posts with a part over 500 characters |
commit-guard | Never commits docs/superpowers, never pushes unless you said push, asks before committing on main/staging/prod |
ctx-keeper | Cache countdown, context, limits and cost band; past 350k it runs /re-fresh, copies it, compacts and pastes it back |
env-bootstrap | Per-project Node version on PATH and env file auto-loaded for Bash, so Claude stops typing nvm use / source .env |
git-band | Git state above the prompt: branch, upstream, ahead/behind, Claude vs your changes, PR and CI, worktree, stash; toasts where each commit landed |
hybrid-agents | Subagents default to Sonnet; pasting a plan path adds the hybrid rule (inline small tasks, Sonnet subagents for big ones) |
rm-to-trash | Rewrites rm into macOS trash so deletes are recoverable and stop hitting the rm deny rule |
tool-preload | Keeps context-mode, jcodemunch, claude-mem, WebSearch, Task and Supabase tools loaded so Claude stops calling ToolSearch for them |
turn-coach | One fork per turn: a verdict on work turns (solved, gaps, shortcuts) plus up to 3 next prompts, in one compact block above the prompt. Merges next-steps and next-steps-supervisor. |
102 skills in skills/. Copy any folder into ~/.claude/skills/ to use it.
| Skill | Description |
|---|---|
alibabacloud-ack-cli | > |
alibabacloud-cfw-internet-firewall-protect | > |
alibabacloud-cfw-status-overview | / |
alibabacloud-cli-guidance | > |
alibabacloud-ddos-security-monitor | / |
alibabacloud-domain-manage | / |
alibabacloud-ecs-diagnose | / |
alibabacloud-esa-pages-deploy | Deploy HTML pages, static directories, or custom edge functions to Alibaba Cloud ESA edge nodes. Manage Edge KV for distributed key-value st |
alibabacloud-find-skills | > |
alibabacloud-network-health-inspection | > |
alibabacloud-network-reachability-analysis | > |
alibabacloud-nginx-ingress-to-api-gateway | / |
alibabacloud-oss-manage-cron-upload | / |
alibabacloud-resourcecenter-search | / |
alibabacloud-solution-deploy | > |
alibabacloud-tair-ai-assistant | / |
alibabacloud-tair-devtoolset | / |
alibabacloud-terraform-code-generation | / |
alibabacloud-waf-bot-management | > |
alibabacloud-waf-security-monitor | / |
api-design-principles | Master REST and GraphQL API design principles to build intuitive, scalable, and maintainable APIs that delight developers. Use when designin |
apply-grant | Prepare an Agentic Engineering Grant application by gathering project data, git history, and context files, then presenting all fields neede |
architecture-patterns | Implement proven backend architecture patterns including Clean Architecture, Hexagonal Architecture, and Domain-Driven Design. Use when arch |
brand-design | Generate, preview, and apply a brand color palette (plus typography, gradients, and tone/voice) to a frontend project. Use when a user says |
bro | Re-explain the previous assistant message in a much simpler way, for when the reply made you go 'bro what'. Use /bro to get a plain-languag |
build-data-pipeline | Guide a developer through building a Solana data pipeline or indexer. Use when a user says "build an indexer", "data pipeline", "analytics", |
build-defi-protocol | Guide a developer through building a DeFi protocol on Solana. Use when a user says "build a DEX", "AMM", "lending protocol", "vault", "yield |
build-mobile | Guide a developer through building a Solana mobile app. Use when a user says "build a mobile app", "React Native Solana", "Solana mobile", " |
build-with-claude | Guide a developer through building their Solana MVP step by step using Claude Code. Use when a user says "help me build this", "start the MV |
carousel-creator | Turns any content idea or Virlo trend data into a complete Instagram carousel post with hooks, slide by slide copy, and posting strategy. Ju |
cinescroll | Build premium scroll-driven landing pages where scroll position controls what happens on screen, frame-scrubbed hero sequences, pinned narr |
code-review | Review code for quality, security, and best practices following team standards. Use when reviewing pull requests, examining code changes, or |
coding-agent | Invoke when ready to CODE a feature. Manages the entire feature development lifecycle through 8-step session cycles - reads project state, s |
colosseum-copilot | Search and analyze 5,400+ Solana hackathon projects using Colosseum Copilot. Find similar projects, discover winner patterns, identify gaps, |
communication-style | Follow expert-level communication preferences: be casual, terse, concise, anticipate needs, provide actual code/explanations not theory, giv |
competitive-landscape | Map the competitive landscape for a crypto product idea. Use when a user says "who are my competitors", "map the competitive landscape", "wh |
context7-documentation | Use Context7 MCP server to reference up-to-date documentation for libraries and frameworks. Use when working with libraries mentioned by the |
cqrs-implementation | Implement Command Query Responsibility Segregation for scalable architectures. Use when separating read and write models, optimizing query p |
create-pitch-deck | Create a structured pitch deck for a crypto project. Use when a user says "create a pitch deck", "help me pitch", "I need slides", "prepare |
create-prd | Create a Product Requirements Document from conversation context. Use when planning new products, features, or when documenting requirements |
cso | / |
data | |
database-migration | Execute database migrations across ORMs and platforms with zero-downtime strategies, data transformation, and rollback procedures. Use when |
debug-program | Help a developer debug a failing Solana program or transaction. Use when a user says "debug my program", "program error", "transaction faile |
defillama-research | Research DeFi protocols and market opportunities using DefiLlama data. Use when a user says "show me TVL data", "which protocols are growing |
deploy-to-mainnet | Guide a Solana project from devnet to mainnet production deployment. Use when a user says "deploy to mainnet", "go to production", "deployme |
ego-browser | When you need a browser, read this Skill by default. Use it to open and operate websites, fill forms, click buttons, take screenshots, extra |
elevenlabs-music | Generate music, sound effects, and voice clips using the ElevenLabs API, then preview them in a web-based player. Use when asked to generate |
event-store-design | Design and implement event stores for event-sourced systems. Use when building event sourcing infrastructure, choosing event store technolog |
feature-verify | Test features after coding them. Invoke after implementing a feature to run tests and mark pass/fail status in features.json. Three modes - |
find-next-crypto-idea | Interview users sharply to discover, rank, or validate what they should build in crypto. Use when a user asks what to build in crypto, wants |
fluxwright-design | Design system skill for fluxwright. Activate when building UI components, pages, or any visual elements. Provides exact color tokens, typogr |
frontend-design-guidelines | Apply high-quality web interface design rules when building, reviewing, or styling frontend code. Use when the user says "build a frontend", |
higgsfield-game-generation | / |
higgsfield-generate | / |
higgsfield-marketplace-cards | / |
higgsfield-product-photoshoot | / |
higgsfield-soul-id | / |
higgsfield-video-explainer | / |
higgsfield-websites | / |
launch-token | Guide a developer through launching a token on Solana. Use when a user says "launch a token", "create a token", "pump.fun", "bonding curve", |
learn | / |
marketing-video | Create marketing videos for Solana projects using Remotion (code-driven) and Renoise (AI-generated). Use when a user says "marketing video", |
mcp-builder | Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-design |
memory-management | Use mem0 memory tool to store and retrieve context across sessions. Use when storing project decisions, user preferences, technical patterns |
merge-conflict-resolver | [TODO: Complete and informative explanation of what the skill does and when to use it. Include WHEN to use this skill - specific scenarios, |
microservices-patterns | Design microservices architectures with service boundaries, event-driven communication, and resilience patterns. Use when building distribut |
monorepo-management | Master monorepo management with Turborepo, Nx, and pnpm workspaces to build efficient, scalable multi-package repositories with optimized bu |
navigate-skills | Meta skill, browse all installed solana-new skills, repos, and MCPs to find the right tool for any task |
neuroarxiv | Grounds a coding agent's architecture decisions in real arXiv prior art before it builds something new. Reads arXiv category-wise via real H |
plan-feature | Create comprehensive feature plans with deep codebase analysis and research. Use when planning new features, breaking down complex tasks, or |
postgresql | Design a PostgreSQL-specific schema. Covers best-practices, data types, indexing, constraints, performance patterns, and advanced features |
product-review | Product quality review, UX flows, onboarding, feature completeness, and user value. Use when a user says "product review", "review my produ |
project-initializer | Set up the two-agent pattern for a new project. Run once at start with /project-initializer "project description". Creates features.json (yo |
project-status | Get a quick project snapshot. Invoke at session start or anytime to see current progress - how many features are done/tested/blocked, recent |
projection-patterns | Build read models and projections from event streams. Use when implementing CQRS read sides, building materialized views, or optimizing quer |
re-fresh | / |
react-components | Converts Stitch designs into modular Vite and React components using system-level networking and AST-based validation. |
reddit-post-draft | > |
refactor | Refactor code with specific focus (performance, readability, maintainability). Use when improving code quality, optimizing code structure, o |
research-gate | Routes "how should I build this" research to the right depth so the cheap answer runs first and the expensive one only fires when it earns i |
review-and-iterate | Review Solana project code for quality, security, and production readiness. Use when a user says "review my code", "is this production ready |
roast-my-product | Harsh, honest product critique, find every weakness before users do. Use when a user says "roast my product", "harsh feedback", "be brutal" |
scaffold-project | Set up a complete Solana project workspace from a validated idea. Use when a user says "scaffold my project", "set up my workspace", "what s |
short-form-script-writer | Turns any content idea into scroll stopping hooks and a complete short form script ready to film for Instagram Reels or TikTok. No prompting |
skill-loader | Discover and load symlinked skills from ~/.cursor/skills/ when needed. Use when a required skill wasn't auto-discovered by Cursor, or when c |
solana-beginner | Teach Solana fundamentals to developers new to the ecosystem. Use when a user says "what is Solana", "why Solana", "new to Solana", "explain |
static-visual-creator | Turns any script line or concept into a polished 4K PNG visual ready to drop straight into your video edit. No Photoshop or Canva needed. Ju |
stock-fundamental-analyzer | Analyse a listed stock on fundamentals only, Indian (NSE/BSE) or US (NYSE/NASDAQ), with Sharia/halal compliance screening built into every |
storm-research | Use when someone asks to run Storm Research, use the storm-research skill, run the STORM method on a topic, says \"storm research this\" / \ |
submit-to-hackathon | Prepare and optimize a hackathon submission for a Solana project. Use when a user says "submit to hackathon", "prepare my submission", "hack |
supabase-mcp | Use Supabase MCP server tools for database operations, queries, and data retrieval. Use when reading from Supabase database, querying tables |
superpowers | |
superpowers-gate | Use when user gives a coding task (feature, fix, refactor, change). Runs BEFORE brainstorming, writing-plans, or TDD. Decides whether to imp |
template | Replace with description of the skill and when Claude should use it. |
thinking-tool | Use thinking tools (mcp_think or sequential thinking) to organize reasoning after context changes. Use when examining files, running command |
toggle-two-agent | Set up the two-agent pattern for a new project. Run once at the start with /project-initializer to create features.json and init.sh structur |
validate | Run comprehensive validation of the project including linting, tests, and build. Use when validating code quality, checking for regressions, |
validate-idea | Run a structured validation sprint on a crypto startup idea. Use when a user says "validate this idea", "is this worth building", "run a val |
video-generator | AI video production workflow using Remotion. Use when creating promotional videos, product demos, social media videos, animated explainers, |
virtual-solana-incubator | Deep technical Solana bootcamp, SVM architecture, Rust patterns, program development. Use when a user says "Solana incubator", "teach me Ru |
website-builder | Build a cinematic, high-fidelity landing page from a brief description, then deploy it live on Netlify. Use when creating websites, building |
Installed from their authors' repos, not copied here. Install with npx skills add <source>.
| `types
hooks/register.tsx 150 lines1// git-band: one line above the prompt with the session repo's git state, so
2// nobody has to ask "which branch did that land on". Runs git and gh locally,
3// no model calls. Refreshes at start, after each turn and after git commands.
4
5import { atom, read, update } from 'claude-code'
6import type { EngineInterface, Register, RenderElement } from 'claude-code'
7
8import type { GitInfo, PrInfo } from '../types'
9
10const DANGER = /^(main|master|staging|prod|production)$/
11const info = atom({ plugin: 'git-band', key: 'info' } as const, null as GitInfo | null)
12const pr = atom({ plugin: 'git-band', key: 'pr' } as const, null as PrInfo | null)
13
14// Files Claude wrote this session (absolute paths); a reload forgets them.
15const claudeFiles = new Set<string>()
16
17async function git($: EngineInterface, root: string, ...args: string[]): Promise<string | null> {
18 const r = await $.process.run(['git', '-C', root, ...args], { timeoutMs: 5000 })
19 return r.exitCode === 0 ? r.stdout.trim() : null
20}
21
22async function refresh($: EngineInterface): Promise<void> {
23 const repo = await $.session.repo()
24 if (repo === null) return void (await update($, info, () => null))
25 const root = repo.root
26 const branch = (await git($, root, 'rev-parse', '--abbrev-ref', 'HEAD')) ?? '?'
27 const upstream = await git($, root, 'rev-parse', '--abbrev-ref', '--symbolic-full-name', '@{u}')
28 const counts = upstream === null ? null : await git($, root, 'rev-list', '--left-right', '--count', '@{u}...HEAD')
29 const [behind, ahead] = (counts ?? '0 0').split(/\s+/).map(Number)
30 const status = (await git($, root, 'status', '--porcelain')) ?? ''
31 const paths = status === '' ? [] : status.split('\n').map(l => l.slice(3).split(' -> ').pop() ?? '')
32 const byClaude = paths.filter(p => claudeFiles.has(`${root}/${p}`)).length
33 const gitDir = await git($, root, 'rev-parse', '--absolute-git-dir')
34 const commonDir = await git($, root, 'rev-parse', '--path-format=absolute', '--git-common-dir')
35 const stash = await git($, root, 'stash', 'list')
36
37 await update($, info, () => ({
38 branch,
39 upstream,
40 ahead: ahead || 0,
41 behind: behind || 0,
42 changed: paths.length,
43 byClaude,
44 worktree: gitDir !== null && commonDir !== null && gitDir !== commonDir ? root.split('/').pop() ?? null : null,
45 stash: stash === null || stash === '' ? 0 : stash.split('\n').length,
46 }))
47}
48
49async function refreshPr($: EngineInterface): Promise<void> {
50 const repo = await $.session.repo()
51 if (repo === null || repo.remote === null) return
52 const r = await $.process.run(['gh', 'pr', 'view', '--json', 'number,state,statusCheckRollup'], {
53 cwd: repo.root,
54 timeoutMs: 15000,
55 })
56 if (r.exitCode !== 0) return void (await update($, pr, () => null))
57 try {
58 const j = JSON.parse(r.stdout) as {
59 number: number
60 state: string
61 statusCheckRollup?: { conclusion?: string; status?: string; state?: string }[]
62 }
63 const checks = j.statusCheckRollup ?? []
64 const states = checks.map(c => (c.conclusion || c.state || c.status || '').toUpperCase())
65 const ci: PrInfo['ci'] =
66 checks.length === 0 ? 'none'
67 : states.some(s => /FAIL|ERROR|CANCEL|TIMED_OUT/.test(s)) ? 'failing'
68 : states.some(s => /PENDING|QUEUED|IN_PROGRESS|EXPECTED|^$/.test(s)) ? 'running'
69 : 'passing'
70 await update($, pr, () => ({ number: j.number, state: j.state.toLowerCase(), ci }))
71 } catch {
72 await update($, pr, () => null)
73 }
74}
75
76export const register: Register = on => {
77 on('session.start', async ($, e, next) => {
78 void refresh($)
79 void refreshPr($)
80 $.clock.every(5 * 60_000, () => void refreshPr($))
81 return next(e)
82 })
83
84 on('turn.complete', async ($, e, next) => {
85 const result = await next(e)
86 if (e.agentId === undefined) void refresh($)
87 return result
88 })
89
90 on('tool.call', { tool: /^(Edit|Write|NotebookEdit)$/ }, async ($, e, next) => {
91 const ran = await next(e)
92 const input = e as unknown as { file_path?: string; notebook_path?: string }
93 const path = input.file_path ?? input.notebook_path
94 if (ran.deny === undefined && ran.isError !== true && path !== undefined) claudeFiles.add(path)
95 return ran
96 })
97
98 on('tool.call', { tool: 'Bash' }, async ($, e, next) => {
99 const ran = await next(e)
100 if (!/\bgit\b/.test(e.command)) return ran
101 await refresh($)
102 if (/\bgit\s+commit\b/.test(e.command) && ran.isError !== true && ran.deny === undefined) {
103 const repo = await $.session.repo()
104 const head = repo === null ? null : await git($, repo.root, 'log', '-1', '--format=%h %s')
105 const now = await read($, info)
106 if (head !== null) $.ui.toast(`commit ${head.slice(0, 60)} → ${now?.branch ?? '?'}`)
107 }
108 if (/\bgit\s+push\b|\bgh\s+pr\b/.test(e.command)) void refreshPr($)
109 return ran
110 })
111
112 on('ui.render', { component: 'AbovePrompt' }, async ($, e, next): Promise<RenderElement> => {
113 const below = await next(e)
114 const g = await read($, info)
115 if (e.props.hasSurvey || g === null) return below
116 const p = await read($, pr)
117 const { Box, Text } = $.ui.resolve(e)
118 const yours = g.changed - g.byClaude
119 const ciColor = p?.ci === 'failing' ? 'red' : p?.ci === 'running' ? 'yellow' : 'green'
120
121 return (
122 <Box flexDirection="column">
123 <Box flexWrap="wrap">
124 <Text color={DANGER.test(g.branch) ? 'red' : 'cyan'} bold>⎇ {g.branch}</Text>
125 {g.upstream !== null && <Text dimColor> → {g.upstream}</Text>}
126 {(g.ahead > 0 || g.behind > 0) && (
127 <Text color={g.ahead > 0 ? 'yellow' : undefined} dimColor={g.ahead === 0}>
128 {' · '}{g.ahead} not pushed{g.behind > 0 ? `, ${g.behind} behind` : ''}
129 </Text>
130 )}
131 {g.upstream === null && <Text color="yellow"> · no upstream</Text>}
132 <Text dimColor>
133 {' · '}
134 {g.changed === 0 ? 'clean' : `${g.changed} changed (${g.byClaude} Claude, ${yours} you)`}
135 </Text>
136 {p !== null && (
137 <Text dimColor>
138 {' · '}PR #{p.number} {p.state}
139 </Text>
140 )}
141 {p !== null && p.ci !== 'none' && <Text color={ciColor}> CI {p.ci}</Text>}
142 {g.worktree !== null && <Text dimColor> · wt {g.worktree}</Text>}
143 {g.stash > 0 && <Text dimColor> · stash {g.stash}</Text>}
144 </Box>
145 {below}
146 </Box>
147 )
148 })
149}
150types/index.d.ts 19 lines1export type GitInfo = {
2 branch: string
3 upstream: string | null
4 ahead: number
5 behind: number
6 changed: number
7 byClaude: number
8 worktree: string | null
9 stash: number
10}
11
12export type PrInfo = { number: number; state: string; ci: 'passing' | 'failing' | 'running' | 'none' }
13
14declare module 'claude-code' {
15 interface PluginState {
16 'git-band': { info: GitInfo | null; pr: PrInfo | null }
17 }
18}
19