Initial commit
This commit is contained in:
12
.claude-plugin/plugin.json
Normal file
12
.claude-plugin/plugin.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"name": "carbon-flow",
|
||||
"description": "Context-efficient Git and Graphite workflows - requires per-project setup after installation",
|
||||
"version": "0.0.0-2025.11.28",
|
||||
"author": {
|
||||
"name": "slamb2k",
|
||||
"email": "slamb2k@users.noreply.github.com"
|
||||
},
|
||||
"skills": [
|
||||
"./skills/graphite-skill"
|
||||
]
|
||||
}
|
||||
3
README.md
Normal file
3
README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
# carbon-flow
|
||||
|
||||
Context-efficient Git and Graphite workflows - requires per-project setup after installation
|
||||
76
plugin.lock.json
Normal file
76
plugin.lock.json
Normal file
@@ -0,0 +1,76 @@
|
||||
{
|
||||
"$schema": "internal://schemas/plugin.lock.v1.json",
|
||||
"pluginId": "gh:slamb2k/mad-skills:carbon-flow",
|
||||
"normalized": {
|
||||
"repo": null,
|
||||
"ref": "refs/tags/v20251128.0",
|
||||
"commit": "87c179a11f31209459a50e760574dd73564b0f8b",
|
||||
"treeHash": "4921a3e3d19d6f7b7f2dbb955b98f89cacc5829b2f3f4698092f7b2672418a85",
|
||||
"generatedAt": "2025-11-28T10:28:25.326715Z",
|
||||
"toolVersion": "publish_plugins.py@0.2.0"
|
||||
},
|
||||
"origin": {
|
||||
"remote": "git@github.com:zhongweili/42plugin-data.git",
|
||||
"branch": "master",
|
||||
"commit": "aa1497ed0949fd50e99e70d6324a29c5b34f9390",
|
||||
"repoRoot": "/Users/zhongweili/projects/openmind/42plugin-data"
|
||||
},
|
||||
"manifest": {
|
||||
"name": "carbon-flow",
|
||||
"description": "Context-efficient Git and Graphite workflows - requires per-project setup after installation"
|
||||
},
|
||||
"content": {
|
||||
"files": [
|
||||
{
|
||||
"path": "README.md",
|
||||
"sha256": "46ee1b8c1fca93d8e3c3c8c7ce757db9bf1d69dd4997cdcff10cf1eb432aa6d4"
|
||||
},
|
||||
{
|
||||
"path": ".claude-plugin/plugin.json",
|
||||
"sha256": "ee28abe1061fd05ef8763b8503f4c87aeb9dd1c0fabd6e08b157af8a5f7584be"
|
||||
},
|
||||
{
|
||||
"path": "skills/graphite-skill/settings.json",
|
||||
"sha256": "1096e41524a7ab5c7ed78347358873714a94665425821b270f98ccbc8a9f49c2"
|
||||
},
|
||||
{
|
||||
"path": "skills/graphite-skill/install.sh",
|
||||
"sha256": "3232869f873071092fa457deab220d981150b8b3458b1e4b61bab59d86c1e4e6"
|
||||
},
|
||||
{
|
||||
"path": "skills/graphite-skill/SKILL.md",
|
||||
"sha256": "39a10ff4fabd528a33c58babd571a4cb5c06f5356cf6ea3056ae23a2ec118126"
|
||||
},
|
||||
{
|
||||
"path": "skills/graphite-skill/test/verify-installation.sh",
|
||||
"sha256": "3a74ba3724df3728518da768068dfa28ad38a154d542406fac6178c6f49e1cfb"
|
||||
},
|
||||
{
|
||||
"path": "skills/graphite-skill/references/quickstart.md",
|
||||
"sha256": "d8d5604d7a929d8e07355e18e98395c73c1ebd50dacc6895005ace8ac9dcc132"
|
||||
},
|
||||
{
|
||||
"path": "skills/graphite-skill/references/readme.md",
|
||||
"sha256": "084132e5d06005efc41e367587fd93462c5d36d5d21716a251e179a65d03d5df"
|
||||
},
|
||||
{
|
||||
"path": "skills/graphite-skill/references/team-configuration.md",
|
||||
"sha256": "bf37b3ca467e1c3f91ce5af7a38b4c1535034de385ecb30dad69e0e0599fbbc0"
|
||||
},
|
||||
{
|
||||
"path": "skills/graphite-skill/agents/graphite-ops-template.md",
|
||||
"sha256": "fc9f4614878621cdeb4ecbcc735d43f39c037d65e8a51f8202c62f267bb52fdd"
|
||||
},
|
||||
{
|
||||
"path": "skills/graphite-skill/hooks/session-start.sh",
|
||||
"sha256": "3456fdcb72d9f8ff7d9c09420169bd3363e68c8d51505934c23fec6b07a78bd6"
|
||||
}
|
||||
],
|
||||
"dirSha256": "4921a3e3d19d6f7b7f2dbb955b98f89cacc5829b2f3f4698092f7b2672418a85"
|
||||
},
|
||||
"security": {
|
||||
"scannedAt": null,
|
||||
"scannerVersion": null,
|
||||
"flags": []
|
||||
}
|
||||
}
|
||||
438
skills/graphite-skill/SKILL.md
Normal file
438
skills/graphite-skill/SKILL.md
Normal file
@@ -0,0 +1,438 @@
|
||||
---
|
||||
name: graphite-skill
|
||||
description: Context-efficient Git and Graphite workflows for Claude Code. Automatically delegates verbose git/Graphite CLI operations to isolated subagents, reducing context pollution by 225x. Use when working with git operations, Graphite stacked diffs, or any git workflow that produces verbose output. Prevents context window exhaustion by automatically applying delegation patterns via SessionStart hooks.
|
||||
---
|
||||
|
||||
# Graphite Skill - Context-Efficient Git/Graphite Workflows
|
||||
|
||||
Stop drowning in verbose git/Graphite output. This skill automatically enables context-efficient workflows for all git and Graphite CLI operations in Claude Code through automatic delegation patterns.
|
||||
|
||||
## Core Principles
|
||||
|
||||
1. **Automatic Delegation**: Verbose git/Graphite operations are automatically delegated to Task subagents
|
||||
2. **Context Isolation**: Raw CLI output (15KB+) is processed in isolated context, summaries (<50 tokens) returned
|
||||
3. **Zero Friction**: SessionStart hooks inject patterns automatically - no manual invocation needed
|
||||
4. **Team-Ready**: Git-trackable configuration for team-wide distribution
|
||||
5. **225x Efficiency**: Dramatic context window improvements (4,108 tokens → 18 tokens)
|
||||
|
||||
## Problem Statement
|
||||
|
||||
### Before Graphite Skill (Context Pollution)
|
||||
|
||||
```bash
|
||||
You: "Check my Graphite stack"
|
||||
Claude: [Returns 15KB of JSON → 4,000+ tokens consumed]
|
||||
Result: Context polluted, reasoning degraded, 2-3 operations max
|
||||
```
|
||||
|
||||
**Traditional git/Graphite operations flood context:**
|
||||
- `gt stack` → 15KB JSON (4,108 tokens)
|
||||
- `git log --graph` → 50KB output (12,000+ tokens)
|
||||
- `gt pr info` → 20KB JSON (5,000+ tokens)
|
||||
- Multiple queries → Context window exhaustion
|
||||
|
||||
### After Graphite Skill (Context Efficiency)
|
||||
|
||||
```bash
|
||||
You: "Check my Graphite stack"
|
||||
Claude: [Automatically delegates to Task subagent]
|
||||
Subagent: [Processes 15KB in isolated context]
|
||||
Claude: "✓ feature/auth | 3 PRs | Review #456"
|
||||
Result: Clean context, 18 tokens used, 100+ operations possible
|
||||
```
|
||||
|
||||
## Installation
|
||||
|
||||
### Auto-Detection (Recommended)
|
||||
|
||||
**The skill automatically detects if setup is needed!**
|
||||
|
||||
When you have the carbon-flow plugin installed globally but haven't set up Graphite Skill in your project, the SessionStart hook will automatically prompt you with:
|
||||
|
||||
```
|
||||
⚠️ Graphite Skill Setup Required
|
||||
|
||||
Would you like to set up Graphite Skill in this project now?
|
||||
|
||||
If yes, run: bash ~/.claude/plugins/mad-skills/graphite-skill/install.sh --project
|
||||
```
|
||||
|
||||
Simply run the provided command and the skill activates immediately. No need to remember or look up installation steps.
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- Git repository
|
||||
- Claude Code 2.0+
|
||||
- (Optional) Graphite CLI for Graphite-specific workflows
|
||||
- (Optional) jq for JSON processing in hooks
|
||||
|
||||
### Manual Installation
|
||||
|
||||
```bash
|
||||
# Navigate to your project
|
||||
cd /path/to/your/project
|
||||
|
||||
# Run the installer
|
||||
bash ~/.claude/plugins/mad-skills/graphite-skill/install.sh --project
|
||||
|
||||
# The installer will:
|
||||
# - Copy hooks to .claude/plugins/graphite-skill/
|
||||
# - Configure SessionStart hook
|
||||
# - Set up agent templates
|
||||
# - Make scripts executable
|
||||
```
|
||||
|
||||
### Manual Installation
|
||||
|
||||
```bash
|
||||
# In your project
|
||||
mkdir -p .claude/plugins/graphite-skill/hooks
|
||||
|
||||
# Copy files from the carbon skill directory
|
||||
cp ~/.claude/plugins/mad-skills/graphite-skill/hooks/session-start.sh .claude/plugins/graphite-skill/hooks/
|
||||
cp ~/.claude/plugins/mad-skills/graphite-skill/settings.json .claude/plugins/graphite-skill/
|
||||
|
||||
# Make hook executable
|
||||
chmod +x .claude/plugins/graphite-skill/hooks/session-start.sh
|
||||
|
||||
# Optional: Copy agent template
|
||||
mkdir -p .claude/agents
|
||||
cp ~/.claude/plugins/mad-skills/graphite-skill/agents/graphite-ops-template.md .claude/agents/
|
||||
```
|
||||
|
||||
### Verification
|
||||
|
||||
```bash
|
||||
# Test hook execution
|
||||
bash .claude/plugins/graphite-skill/hooks/session-start.sh
|
||||
|
||||
# Should output JSON with hookSpecificOutput
|
||||
|
||||
# Test in Claude Code
|
||||
claude --debug hooks
|
||||
|
||||
# Look for:
|
||||
# [SessionStart] Executing hook: session-start.sh
|
||||
# [SessionStart] Hook completed successfully
|
||||
```
|
||||
|
||||
## How It Works
|
||||
|
||||
### SessionStart Hook Mechanism
|
||||
|
||||
The skill uses a SessionStart hook to inject context-optimization patterns automatically:
|
||||
|
||||
```
|
||||
1. Session starts → SessionStart hook fires
|
||||
2. Hook detects: git repo, project setup status, Graphite CLI, custom agent
|
||||
3a. If not set up → Prompts user to run install.sh (auto-detection)
|
||||
3b. If set up → Hook injects ~800 tokens of delegation patterns into context
|
||||
4. Claude knows: Use Task delegation for verbose operations automatically
|
||||
5. User benefits: Automatic context efficiency, zero manual effort
|
||||
```
|
||||
|
||||
**Auto-Detection Logic:**
|
||||
|
||||
The hook intelligently detects whether per-project setup has been completed by checking for the existence of `.claude/plugins/graphite-skill/hooks/session-start.sh` in your project directory.
|
||||
|
||||
- **Not set up**: Hook displays setup prompt with installation instructions
|
||||
- **Set up**: Hook injects delegation patterns and activates context optimization
|
||||
|
||||
This means you never have to remember installation steps - the skill tells you exactly what to do.
|
||||
|
||||
### Automatic Delegation Pattern
|
||||
|
||||
When you request git/Graphite operations, Claude automatically:
|
||||
|
||||
1. **Recognizes** the operation will return verbose output
|
||||
2. **Delegates** to Task subagent with explicit instructions:
|
||||
- Use `--json` flags for structured output
|
||||
- Redirect errors with `2>/dev/null`
|
||||
- Parse and summarize results
|
||||
3. **Subagent executes** in isolated context (absorbs verbose output)
|
||||
4. **Subagent returns** concise summary (<50 tokens)
|
||||
5. **You receive** actionable summary without context pollution
|
||||
|
||||
**No manual invocation needed - patterns apply automatically!**
|
||||
|
||||
## Workflows
|
||||
|
||||
### Basic Git Operations
|
||||
|
||||
**Checking status:**
|
||||
```bash
|
||||
You: "Check git status"
|
||||
Claude: [Delegates automatically]
|
||||
→ "3 modified, 2 staged, 1 untracked | Ready to commit"
|
||||
```
|
||||
|
||||
**Viewing commit history:**
|
||||
```bash
|
||||
You: "Show me recent commits"
|
||||
Claude: [Delegates automatically]
|
||||
→ "Last 10: abc123 Feature, def456 Fix, ... | 3 authors, 2 days"
|
||||
```
|
||||
|
||||
**Reviewing changes:**
|
||||
```bash
|
||||
You: "Show git diff"
|
||||
Claude: [Delegates automatically]
|
||||
→ "+47/-12 across 3 files | auth.ts, api.ts, tests/ | No conflicts"
|
||||
```
|
||||
|
||||
### Graphite Workflows
|
||||
|
||||
**Stack status:**
|
||||
```bash
|
||||
You: "Check my Graphite stack"
|
||||
Claude: [Delegates automatically]
|
||||
→ "✓ feature/auth | 3 PRs | #456 (needs review), #457 (approved), #458 (draft)"
|
||||
```
|
||||
|
||||
**PR management:**
|
||||
```bash
|
||||
You: "Show PRs needing review"
|
||||
Claude: [Delegates automatically]
|
||||
→ "📋 2 PRs: #456 (Auth - awaiting review), #459 (Docs - changes requested)"
|
||||
```
|
||||
|
||||
**Submitting stack:**
|
||||
```bash
|
||||
You: "Submit my stack for review"
|
||||
Claude: [Delegates automatically]
|
||||
→ "✓ 3 PRs created | CI running on all | Ready for review"
|
||||
```
|
||||
|
||||
**Stack navigation:**
|
||||
```bash
|
||||
You: "Navigate to next branch in stack"
|
||||
Claude: [Delegates automatically]
|
||||
→ "Switched to feature/auth-ui (3/5 in stack)"
|
||||
```
|
||||
|
||||
### Supported Operations
|
||||
|
||||
**Git Commands (auto-delegated):**
|
||||
- `git log --graph` - Commit history with summarization
|
||||
- `git diff` - Changes with statistics
|
||||
- `git status` - Status with file grouping
|
||||
- `git branch` - Branch listing with current indicator
|
||||
- All other verbose git commands
|
||||
|
||||
**Graphite CLI Commands (auto-delegated):**
|
||||
- `gt stack` - Stack status with PR summaries
|
||||
- `gt pr list` - PR listing with filtering
|
||||
- `gt pr info` - Detailed PR data with parsing
|
||||
- `gt submit` - Submission with confirmation
|
||||
- `gt log` - Stack history with formatting
|
||||
- All other verbose gt commands
|
||||
|
||||
## Two Approaches: Task Tool vs Custom Agent
|
||||
|
||||
### Task Tool (Default - Recommended)
|
||||
|
||||
Zero setup, works immediately with automatic delegation:
|
||||
|
||||
```bash
|
||||
You: "Check my stack"
|
||||
Claude: [Uses Task delegation automatically]
|
||||
→ Concise summary
|
||||
```
|
||||
|
||||
**Characteristics:**
|
||||
- ⚡ No configuration needed
|
||||
- 📦 Works universally
|
||||
- 🎯 Full context isolation
|
||||
- ⚪ Standard terminal output
|
||||
- ✅ **Recommended for most users**
|
||||
|
||||
### Custom Agent (Optional - Power Users)
|
||||
|
||||
Enhanced UX with colored terminal output:
|
||||
|
||||
```bash
|
||||
# One-time setup in Claude Code
|
||||
/agents create
|
||||
Name: graphite-ops
|
||||
Color: cyan
|
||||
Scope: project
|
||||
Prompt: Load from .claude/agents/graphite-ops-template.md
|
||||
|
||||
# Use with color
|
||||
You: "graphite-ops check my stack"
|
||||
graphite-ops [cyan]: ✓ feature/auth | 3 PRs | Review #456
|
||||
```
|
||||
|
||||
**Characteristics:**
|
||||
- 🎨 Colored terminal output (cyan)
|
||||
- 👤 Consistent persona
|
||||
- 📁 Git-tracked definition
|
||||
- 🎯 Same context isolation
|
||||
- 🔧 Requires one-time agent creation
|
||||
|
||||
**Agent Template Location:** `graphite-skill/agents/graphite-ops-template.md`
|
||||
|
||||
## Team Distribution
|
||||
|
||||
Graphite Skill is designed for team-wide adoption:
|
||||
|
||||
```bash
|
||||
# One team member sets up
|
||||
./install.sh --project
|
||||
git add .claude/
|
||||
git commit -m "Add Graphite Skill context-optimization for git/Graphite"
|
||||
git push
|
||||
|
||||
# Other team members pull and get:
|
||||
# ✓ Automatic context optimization
|
||||
# ✓ Consistent behavior across team
|
||||
# ✓ Zero per-developer setup
|
||||
```
|
||||
|
||||
**Team benefits:**
|
||||
- Consistent git/Graphite workflows
|
||||
- Automatic efficiency for all developers
|
||||
- Git-tracked configuration (no separate distribution)
|
||||
- SessionStart hook activates automatically
|
||||
|
||||
## Configuration
|
||||
|
||||
### Default Configuration
|
||||
|
||||
The skill works out-of-box with sensible defaults. No configuration required.
|
||||
|
||||
### Custom Configuration
|
||||
|
||||
Adjust behavior by editing `.claude/plugins/graphite-skill/settings.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"contextTokens": 800,
|
||||
"delegationThreshold": 100,
|
||||
"autoDetectGraphite": true,
|
||||
"autoDetectCustomAgent": true,
|
||||
"enableTaskDelegation": true,
|
||||
"enableCustomAgent": true
|
||||
}
|
||||
```
|
||||
|
||||
**Settings explanation:**
|
||||
- `contextTokens`: Amount of pattern context injected (default: 800)
|
||||
- `delegationThreshold`: Token size to trigger delegation (default: 100)
|
||||
- `autoDetectGraphite`: Automatically detect Graphite CLI presence (default: true)
|
||||
- `autoDetectCustomAgent`: Detect and suggest custom agent if available (default: true)
|
||||
- `enableTaskDelegation`: Enable automatic Task delegation (default: true)
|
||||
- `enableCustomAgent`: Enable custom agent support (default: true)
|
||||
|
||||
## Efficiency Metrics
|
||||
|
||||
| Metric | Before (Raw CLI) | After (Graphite Skill) | Improvement |
|
||||
|--------|------------------|----------------|-------------|
|
||||
| Tokens consumed | 4,108 | 18 | **225x** |
|
||||
| Context pollution | High | Minimal | **99.6% reduction** |
|
||||
| Response quality | Degraded | Optimal | **Focused reasoning** |
|
||||
| User effort | Manual patterns | Zero | **Automatic** |
|
||||
| Operations before exhaustion | 2-3 | 100+ | **50x** |
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Hook not firing
|
||||
|
||||
```bash
|
||||
# Check permissions
|
||||
chmod +x .claude/plugins/graphite-skill/hooks/session-start.sh
|
||||
|
||||
# Check settings.json exists
|
||||
ls -la .claude/settings.json
|
||||
|
||||
# Test manually
|
||||
bash .claude/plugins/graphite-skill/hooks/session-start.sh | jq .
|
||||
```
|
||||
|
||||
### Context not appearing
|
||||
|
||||
```bash
|
||||
# Verify hook returns correct JSON
|
||||
bash .claude/plugins/graphite-skill/hooks/session-start.sh | \
|
||||
jq '.hookSpecificOutput.hookEventName'
|
||||
|
||||
# Should output: "SessionStart"
|
||||
```
|
||||
|
||||
### Patterns not applied
|
||||
|
||||
Start Claude with debug mode:
|
||||
|
||||
```bash
|
||||
claude --debug hooks
|
||||
|
||||
# Check for:
|
||||
# - Hook execution confirmation
|
||||
# - Context injection success
|
||||
# - Any error messages
|
||||
```
|
||||
|
||||
### Delegation not automatic
|
||||
|
||||
If Claude doesn't delegate automatically:
|
||||
|
||||
1. Verify SessionStart hook is active: `claude --debug hooks`
|
||||
2. Check hook output contains delegation patterns
|
||||
3. Manually request delegation: "Use Task delegation for this"
|
||||
4. Review hook configuration in `settings.json`
|
||||
|
||||
## Files and Structure
|
||||
|
||||
```
|
||||
graphite-skill/
|
||||
├── SKILL.md # This file - complete skill reference
|
||||
├── install.sh # Automated installation script
|
||||
├── settings.json # Configuration settings
|
||||
├── hooks/
|
||||
│ └── session-start.sh # SessionStart hook for pattern injection
|
||||
├── agents/
|
||||
│ └── graphite-ops-template.md # Custom agent template (optional)
|
||||
├── examples/
|
||||
│ └── team-configuration.md # Example team configurations
|
||||
├── test/
|
||||
│ └── verify-installation.sh # Installation verification script
|
||||
├── QUICKSTART.md # Quick start guide
|
||||
└── README.md # Detailed documentation
|
||||
|
||||
References (from root skill directory):
|
||||
- QUICKSTART.md - 5-minute setup guide
|
||||
- README.md - Complete documentation
|
||||
- examples/team-configuration.md - Team setup examples
|
||||
```
|
||||
|
||||
## When to Use This Skill
|
||||
|
||||
**Always active** - The SessionStart hook applies patterns automatically, so you don't need to manually invoke this skill. Just use git/Graphite naturally:
|
||||
|
||||
- Checking stack status
|
||||
- Reviewing PRs
|
||||
- Viewing commit history
|
||||
- Managing branches
|
||||
- Submitting for review
|
||||
- Any git/Graphite operation
|
||||
|
||||
**The skill is already working if:**
|
||||
- SessionStart hook is installed
|
||||
- Claude automatically delegates verbose operations
|
||||
- You receive concise summaries instead of raw output
|
||||
|
||||
## References
|
||||
|
||||
For detailed information:
|
||||
- **Quick Start**: `graphite-skill/QUICKSTART.md` - 5-minute setup guide
|
||||
- **Installation**: `graphite-skill/install.sh` - Automated installation
|
||||
- **Team Setup**: `graphite-skill/examples/team-configuration.md` - Team configuration examples
|
||||
- **Agent Template**: `graphite-skill/agents/graphite-ops-template.md` - Custom agent definition
|
||||
|
||||
## Status
|
||||
|
||||
- ✅ Production-ready
|
||||
- ✅ Tested with Claude Code 2.0+
|
||||
- ✅ Compatible with Graphite CLI 1.0+
|
||||
- ✅ Team-ready with git-tracked configuration
|
||||
- ✅ Zero-friction automatic activation
|
||||
327
skills/graphite-skill/agents/graphite-ops-template.md
Normal file
327
skills/graphite-skill/agents/graphite-ops-template.md
Normal file
@@ -0,0 +1,327 @@
|
||||
# graphite-ops Agent Template
|
||||
|
||||
**Use this template when creating a custom graphite-ops agent via `/agents create`**
|
||||
|
||||
---
|
||||
|
||||
You are **graphite-ops**, a specialized agent for context-efficient Graphite and git operations.
|
||||
|
||||
## Your Mission
|
||||
|
||||
Execute git and Graphite CLI commands while maintaining extreme context efficiency. You absorb verbose command output in your isolated context and return only essential summaries to the main orchestration agent.
|
||||
|
||||
## Core Principles
|
||||
|
||||
### 1. Context Efficiency is Paramount
|
||||
- Your context window is disposable; the main agent's is precious
|
||||
- All verbose output stays in YOUR context
|
||||
- Return summaries under 50 tokens
|
||||
- Think: "What decision does the main agent need to make?"
|
||||
|
||||
### 2. Structured Data Processing
|
||||
- Always use `--json` flags when available
|
||||
- Parse JSON/structured output before summarizing
|
||||
- Extract only decision-relevant information
|
||||
- Suppress errors with `2>/dev/null`
|
||||
|
||||
### 3. Actionable Intelligence
|
||||
- Don't just report status; recommend next actions
|
||||
- Format: `✓ [current state] | [key metric] | [next action]`
|
||||
- Example: `✓ feature/auth | 3 PRs | Review #456`
|
||||
|
||||
## Command Execution Patterns
|
||||
|
||||
### Graphite Stack Operations
|
||||
|
||||
**Check stack status:**
|
||||
```bash
|
||||
gt stack --json 2>/dev/null | jq -r '{
|
||||
current: .current.branch,
|
||||
total: (.stack | length),
|
||||
needs_review: [.stack[] | select(.status=="needs_review") | .number],
|
||||
failing_ci: [.stack[] | select(.ci_status=="failing") | .number]
|
||||
}'
|
||||
```
|
||||
|
||||
**Return format:**
|
||||
```
|
||||
✓ [branch-name] | [N] PRs | Review: #[nums] | CI failing: #[nums]
|
||||
```
|
||||
|
||||
**Navigate stack:**
|
||||
```bash
|
||||
# Go to next branch in stack
|
||||
NEXT=$(gt stack --json 2>/dev/null | jq -r '.stack[1].branch')
|
||||
gt checkout "$NEXT" 2>/dev/null
|
||||
echo "✓ Switched to $NEXT"
|
||||
```
|
||||
|
||||
**Return format:**
|
||||
```
|
||||
✓ Switched to [branch-name] | Position: [N] of [total] in stack
|
||||
```
|
||||
|
||||
### PR Operations
|
||||
|
||||
**List PRs needing review:**
|
||||
```bash
|
||||
gt pr list --json 2>/dev/null | jq -r '
|
||||
[.[] | select(.waiting_for_review) | {num: .number, title: .title}] | .[0:3]
|
||||
'
|
||||
```
|
||||
|
||||
**Return format:**
|
||||
```
|
||||
📋 [N] PRs need review:
|
||||
#[num]: [title]
|
||||
#[num]: [title]
|
||||
(+[remainder] more)
|
||||
```
|
||||
|
||||
**Check PR status:**
|
||||
```bash
|
||||
gt pr info <number> --json 2>/dev/null | jq -r '{
|
||||
status: .status,
|
||||
approvals: (.reviews | map(select(.state=="APPROVED")) | length),
|
||||
ci: .ci_status,
|
||||
mergeable: .mergeable
|
||||
}'
|
||||
```
|
||||
|
||||
**Return format:**
|
||||
```
|
||||
PR #[num]: [N] approvals | CI: [status] | Mergeable: [yes/no]
|
||||
```
|
||||
|
||||
**Submit stack:**
|
||||
```bash
|
||||
gt submit 2>&1 | head -20
|
||||
```
|
||||
|
||||
**Return format:**
|
||||
```
|
||||
✓ [N] PRs created/updated | CI: [status] | Ready for review
|
||||
```
|
||||
|
||||
### Git Operations
|
||||
|
||||
**Commit history:**
|
||||
```bash
|
||||
git log --oneline --graph -10 2>/dev/null
|
||||
```
|
||||
|
||||
**Return format:**
|
||||
```
|
||||
Last 10 commits:
|
||||
abc123 Feature: Add authentication
|
||||
def456 Fix: API error handling
|
||||
...
|
||||
```
|
||||
|
||||
**Diff summary:**
|
||||
```bash
|
||||
git diff --stat 2>/dev/null | tail -1
|
||||
```
|
||||
|
||||
**Return format:**
|
||||
```
|
||||
±[N] files | +[adds]/-[dels] lines
|
||||
```
|
||||
|
||||
**File changes:**
|
||||
```bash
|
||||
git diff --name-status 2>/dev/null | head -10
|
||||
```
|
||||
|
||||
**Return format:**
|
||||
```
|
||||
Modified: [file1], [file2]
|
||||
Added: [file3]
|
||||
```
|
||||
|
||||
**Current branch:**
|
||||
```bash
|
||||
git branch --show-current 2>/dev/null
|
||||
```
|
||||
|
||||
**Return format:**
|
||||
```
|
||||
Current branch: [name]
|
||||
```
|
||||
|
||||
## Response Templates
|
||||
|
||||
### Success Operations
|
||||
```
|
||||
✓ [operation completed] | [key result] | Next: [action]
|
||||
```
|
||||
|
||||
### Status Checks
|
||||
```
|
||||
📊 [metric]: [value] | [metric]: [value] | [recommendation]
|
||||
```
|
||||
|
||||
### Lists
|
||||
```
|
||||
📋 [N] items:
|
||||
• [item 1] - [detail]
|
||||
• [item 2] - [detail]
|
||||
• [item 3] - [detail]
|
||||
(+[remainder] more)
|
||||
```
|
||||
|
||||
### Errors
|
||||
```
|
||||
❌ [operation] failed | Reason: [brief explanation] | Fix: [action]
|
||||
```
|
||||
|
||||
### Warnings
|
||||
```
|
||||
⚠️ [concern] | Impact: [brief] | Consider: [action]
|
||||
```
|
||||
|
||||
## Decision-Making Framework
|
||||
|
||||
When processing command output, ask yourself:
|
||||
|
||||
1. **What decision is the main agent trying to make?**
|
||||
- Branching? → Return current location + navigation options
|
||||
- Review? → Return PRs needing attention + prioritization
|
||||
- Debugging? → Return failures + suggested next steps
|
||||
|
||||
2. **What's the minimum information needed?**
|
||||
- Status: current state only
|
||||
- Lists: top 3 items + count of remainder
|
||||
- Changes: summary statistics, not line-by-line diffs
|
||||
|
||||
3. **What action should follow?**
|
||||
- Always recommend the logical next step
|
||||
- Make it concrete: "Review #456" not "continue workflow"
|
||||
|
||||
## Error Handling
|
||||
|
||||
**When commands fail:**
|
||||
```bash
|
||||
# Capture exit code
|
||||
gt pr create 2>&1
|
||||
EXIT_CODE=$?
|
||||
|
||||
if [ $EXIT_CODE -ne 0 ]; then
|
||||
# Return actionable error
|
||||
echo "❌ PR creation failed | Check: branch has commits, no existing PR | Fix: gt pr status"
|
||||
fi
|
||||
```
|
||||
|
||||
**When no data found:**
|
||||
```
|
||||
ℹ️ No [items] found | Reason: [why] | Next: [create/check/wait]
|
||||
```
|
||||
|
||||
## Parallel Operations Support
|
||||
|
||||
You may be invoked alongside other agents. Execute your operation independently:
|
||||
|
||||
```markdown
|
||||
# Scenario: Main agent wants comprehensive status
|
||||
# You handle: Graphite stack
|
||||
# Other agents handle: CI status, review comments
|
||||
|
||||
Execute your check, return your summary.
|
||||
Main agent will synthesize all results.
|
||||
```
|
||||
|
||||
## Critical Rules
|
||||
|
||||
### ALWAYS:
|
||||
1. ✅ Use `--json` flags for structured output
|
||||
2. ✅ Suppress stderr with `2>/dev/null`
|
||||
3. ✅ Parse before returning (no raw command output)
|
||||
4. ✅ Keep responses under 50 tokens
|
||||
5. ✅ Include next action recommendation
|
||||
6. ✅ Use emoji prefixes for visual parsing (✓ ❌ 📋 ⚠️ ℹ️ 📊)
|
||||
|
||||
### NEVER:
|
||||
1. ❌ Return raw JSON to main agent
|
||||
2. ❌ Return full git diffs (use `--stat` or summary)
|
||||
3. ❌ Return verbose logs (summarize or truncate to top 10)
|
||||
4. ❌ Return more than 5 list items (summarize remainder)
|
||||
5. ❌ Make the main agent parse structured data
|
||||
6. ❌ Forget the next action recommendation
|
||||
|
||||
## Examples
|
||||
|
||||
### Good Response
|
||||
```
|
||||
User: "Check my stack"
|
||||
You execute: gt stack --json 2>/dev/null + parsing
|
||||
You return: "✓ feature/auth | 3 PRs | Review: #456, #457 | CI passing"
|
||||
Tokens: 18
|
||||
Main agent: Can make decisions with this information
|
||||
```
|
||||
|
||||
### Bad Response
|
||||
```
|
||||
User: "Check my stack"
|
||||
You execute: gt stack --json 2>/dev/null
|
||||
You return: [15KB of JSON]
|
||||
Tokens: 4,108
|
||||
Main agent: Context polluted, can't reason effectively
|
||||
```
|
||||
|
||||
### Good Error Response
|
||||
```
|
||||
User: "Create PR"
|
||||
You execute: gt pr create 2>&1
|
||||
Result: Error - no commits
|
||||
You return: "❌ PR creation failed | No commits on branch | Next: make changes and commit"
|
||||
Tokens: 24
|
||||
Main agent: Knows problem and solution
|
||||
```
|
||||
|
||||
### Bad Error Response
|
||||
```
|
||||
User: "Create PR"
|
||||
You execute: gt pr create 2>&1
|
||||
Result: [Full stack trace]
|
||||
You return: [Full stack trace]
|
||||
Tokens: 350
|
||||
Main agent: Overwhelmed with technical noise
|
||||
```
|
||||
|
||||
## Philosophy
|
||||
|
||||
You are a **filter**, not a **conduit**.
|
||||
|
||||
- **Conduit:** Passes data through unchanged → context pollution
|
||||
- **Filter:** Extracts essence, provides intelligence → context efficiency
|
||||
|
||||
Your value is in **compression without information loss**. The main agent should never need the verbose output you processed; your summary should contain every decision-relevant fact.
|
||||
|
||||
## Integration with Main Workflows
|
||||
|
||||
When the main agent uses you as part of larger workflows:
|
||||
|
||||
```markdown
|
||||
# Example: Feature development workflow
|
||||
|
||||
Main Agent: "I need to start a new feature"
|
||||
Main Agent → You: "Check if I'm on trunk and stack is clean"
|
||||
You: "✓ On main | Stack: empty | Ready to branch"
|
||||
|
||||
Main Agent: "Create feature/auth branch"
|
||||
Main Agent → You: "Create and switch to feature/auth"
|
||||
You: "✓ Created feature/auth | Switched from main | Ready to code"
|
||||
|
||||
Main Agent: [works on feature]
|
||||
|
||||
Main Agent → You: "Submit stack for review"
|
||||
You: [Creates PRs, returns] "✓ PR #789 created | CI running | Ready for review"
|
||||
```
|
||||
|
||||
Your responses enable the main agent to orchestrate smoothly without getting bogged down in CLI details.
|
||||
|
||||
---
|
||||
|
||||
**Remember:** You are graphite-ops [cyan]. Your job is to keep the main orchestration agent's context clean while providing precise, actionable intelligence about Graphite and git operations. Every response should answer: "What's the state?" and "What should we do next?"
|
||||
|
||||
Operate with extreme precision. The main agent's effectiveness depends on your context discipline.
|
||||
320
skills/graphite-skill/hooks/session-start.sh
Executable file
320
skills/graphite-skill/hooks/session-start.sh
Executable file
@@ -0,0 +1,320 @@
|
||||
#!/bin/bash
|
||||
|
||||
# SessionStart Hook for Graphite Context-Optimization Plugin
|
||||
# Version: 2.0.0
|
||||
# This hook injects context-efficient patterns into Claude's context window
|
||||
# Output is automatically added to Claude's context at session start
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# Only activate in git repositories
|
||||
if [ ! -d "$CLAUDE_PROJECT_DIR/.git" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Detect if per-project setup has been completed
|
||||
PROJECT_SETUP_COMPLETE=false
|
||||
if [ -f "$CLAUDE_PROJECT_DIR/.claude/plugins/graphite-skill/hooks/session-start.sh" ]; then
|
||||
PROJECT_SETUP_COMPLETE=true
|
||||
fi
|
||||
|
||||
# If setup not complete, prompt user to install
|
||||
if [ "$PROJECT_SETUP_COMPLETE" = false ]; then
|
||||
SETUP_PROMPT="# ⚠️ Graphite Skill Setup Required
|
||||
|
||||
The **Graphite Skill** (carbon-flow plugin) is installed globally but not set up in this project.
|
||||
|
||||
## What This Skill Does
|
||||
|
||||
Graphite Skill provides **225x context efficiency** for git and Graphite CLI operations by automatically delegating verbose commands to Task subagents. This keeps your context window clean and allows 100+ operations before context exhaustion.
|
||||
|
||||
**Without setup:** git/Graphite commands flood context with thousands of tokens
|
||||
**With setup:** Same commands consume <50 tokens via automatic delegation
|
||||
|
||||
## Quick Setup (30 seconds)
|
||||
|
||||
To enable automatic context-efficient git/Graphite workflows in this project:
|
||||
|
||||
\`\`\`bash
|
||||
bash ~/.claude/plugins/mad-skills/graphite-skill/install.sh --project
|
||||
\`\`\`
|
||||
|
||||
This will:
|
||||
- Copy SessionStart hook to project's \`.claude/plugins/graphite-skill/\` directory
|
||||
- Enable automatic delegation patterns for git/Graphite operations
|
||||
- Activate 225x efficiency improvement immediately
|
||||
|
||||
## What You Get
|
||||
|
||||
After setup, all git/Graphite operations automatically become context-efficient:
|
||||
- \`gt stack\` → Returns concise summary instead of 15KB JSON
|
||||
- \`git log\` → Returns formatted commits instead of verbose output
|
||||
- \`git diff\` → Returns change stats instead of full diff
|
||||
- All operations → <50 tokens per command
|
||||
|
||||
**Would you like to set up Graphite Skill in this project now?**
|
||||
|
||||
If yes, run: \`bash ~/.claude/plugins/mad-skills/graphite-skill/install.sh --project\`
|
||||
If not now, you can set it up anytime - just run the command above.
|
||||
|
||||
---
|
||||
*This prompt appears because the carbon-flow plugin is installed but per-project setup hasn't been run yet.*"
|
||||
|
||||
# Return JSON with setup prompt
|
||||
cat <<EOF
|
||||
{
|
||||
"hookSpecificOutput": {
|
||||
"hookEventName": "SessionStart",
|
||||
"additionalContext": $(echo "$SETUP_PROMPT" | jq -Rs .)
|
||||
}
|
||||
}
|
||||
EOF
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Detect available tools
|
||||
HAS_GRAPHITE=false
|
||||
if command -v gt &> /dev/null 2>&1; then
|
||||
if gt --version &> /dev/null 2>&1; then
|
||||
HAS_GRAPHITE=true
|
||||
fi
|
||||
fi
|
||||
|
||||
# Detect custom agent
|
||||
HAS_CUSTOM_AGENT=false
|
||||
if [ -f "$CLAUDE_PROJECT_DIR/.claude/agents/graphite-ops.md" ]; then
|
||||
HAS_CUSTOM_AGENT=true
|
||||
fi
|
||||
|
||||
# Build context instructions
|
||||
CONTEXT="# Graphite Context-Optimization Plugin Active (v2.0)
|
||||
|
||||
## CRITICAL: Automatic Context-Efficient Git/Graphite Operations
|
||||
|
||||
You are operating with context-optimization patterns for git and Graphite CLI operations. These patterns are ALWAYS active and should be applied automatically.
|
||||
|
||||
### Core Principle: Subagent Isolation
|
||||
|
||||
For ANY git or Graphite operation that returns verbose output (>100 tokens), automatically delegate to a Task subagent to keep the main context clean.
|
||||
|
||||
### Automatic Delegation Triggers
|
||||
|
||||
Delegate to Task subagent for:
|
||||
- \`gt stack\` → Returns 15KB JSON output
|
||||
- \`gt pr list\` → Large PR lists
|
||||
- \`gt pr info <number>\` → Detailed PR data
|
||||
- \`git log --graph\` → Multi-line commit history
|
||||
- \`git diff\` → File change details
|
||||
- \`git status\` (when verbose) → Long file lists
|
||||
- Any git/Graphite command returning >100 tokens
|
||||
|
||||
### Delegation Pattern
|
||||
|
||||
When verbose output is expected:
|
||||
|
||||
1. Recognize the operation will be verbose
|
||||
2. Delegate to Task subagent with explicit instructions
|
||||
3. Subagent executes with --json and 2>/dev/null
|
||||
4. Subagent parses and returns summary <50 tokens
|
||||
5. Main agent receives only essential summary
|
||||
|
||||
**Format:**
|
||||
\`\`\`
|
||||
Delegate to task subagent:
|
||||
- Execute: [command with --json if available] 2>/dev/null
|
||||
- Parse: [extract only: state, count, next action]
|
||||
- Return: ✓ [state] | [metric] | [action]
|
||||
- Limit: <50 tokens
|
||||
\`\`\`
|
||||
|
||||
### Output Suppression Rules
|
||||
|
||||
ALWAYS apply these to git/graphite commands:
|
||||
1. Use \`--json\` flags when available
|
||||
2. Suppress stderr: \`2>/dev/null\`
|
||||
3. Limit output: \`| head -20\` for text
|
||||
4. Parse JSON: Don't return raw JSON to main context
|
||||
5. Summarize: Extract only decision-relevant information"
|
||||
|
||||
# Add Graphite-specific guidance
|
||||
if [ "$HAS_GRAPHITE" = true ]; then
|
||||
CONTEXT+="
|
||||
|
||||
### Graphite Operations (gt command available)
|
||||
|
||||
**Stack status:**
|
||||
\`\`\`
|
||||
Delegate to task subagent:
|
||||
- Execute: gt stack --json 2>/dev/null
|
||||
- Parse: current branch, PR count, needs_review status
|
||||
- Return: ✓ feature/auth | 3 PRs | Review: #456
|
||||
\`\`\`
|
||||
|
||||
**PR list:**
|
||||
\`\`\`
|
||||
Delegate to task subagent:
|
||||
- Execute: gt pr list --json 2>/dev/null
|
||||
- Parse: PRs waiting for my review (top 3 only)
|
||||
- Return: 📋 2 PRs need review: #456 (Auth), #457 (Docs)
|
||||
\`\`\`
|
||||
|
||||
**PR details:**
|
||||
\`\`\`
|
||||
Delegate to task subagent:
|
||||
- Execute: gt pr info <number> --json 2>/dev/null
|
||||
- Parse: status, approvals, CI status, mergeable
|
||||
- Return: PR #456 | 2 approvals | CI passing | Mergeable
|
||||
\`\`\`
|
||||
|
||||
**Submit stack:**
|
||||
\`\`\`
|
||||
Delegate to task subagent:
|
||||
- Execute: gt submit 2>/dev/null
|
||||
- Parse: PRs created, any errors
|
||||
- Return: ✓ 3 PRs submitted | CI running | Ready for review
|
||||
\`\`\`"
|
||||
fi
|
||||
|
||||
# Add custom agent guidance if available
|
||||
if [ "$HAS_CUSTOM_AGENT" = true ]; then
|
||||
CONTEXT+="
|
||||
|
||||
### Custom Agent Available: graphite-ops
|
||||
|
||||
A custom agent is configured for enhanced UX. Prefer using it:
|
||||
|
||||
\`\`\`
|
||||
graphite-ops check my stack
|
||||
graphite-ops show PRs needing review
|
||||
graphite-ops submit for review
|
||||
graphite-ops navigate to next branch
|
||||
\`\`\`
|
||||
|
||||
The graphite-ops agent provides:
|
||||
- Colored terminal output [cyan]
|
||||
- Consistent persona across operations
|
||||
- Same context isolation as Task
|
||||
- Team-shared definition via git"
|
||||
else
|
||||
CONTEXT+="
|
||||
|
||||
### Custom Agent Setup (Optional)
|
||||
|
||||
Users can create a custom agent for enhanced UX:
|
||||
\`\`\`
|
||||
/agents create
|
||||
Name: graphite-ops
|
||||
Color: cyan
|
||||
Scope: project
|
||||
Prompt: Load from ./agents/graphite-ops-template.md
|
||||
\`\`\`
|
||||
|
||||
This provides colored terminal output and consistent persona."
|
||||
fi
|
||||
|
||||
# Add git-specific guidance
|
||||
CONTEXT+="
|
||||
|
||||
### Git Operations
|
||||
|
||||
**Commit history:**
|
||||
\`\`\`
|
||||
Delegate to task subagent:
|
||||
- Execute: git log --oneline --graph -10 2>/dev/null
|
||||
- Parse: Extract commit messages only
|
||||
- Return: Last 10: abc123 Feature, def456 Fix, ...
|
||||
\`\`\`
|
||||
|
||||
**Diff summary:**
|
||||
\`\`\`
|
||||
Delegate to task subagent:
|
||||
- Execute: git diff --stat 2>/dev/null | tail -1
|
||||
- Parse: File count, insertion/deletion counts
|
||||
- Return: ±3 files | +45/-12 lines
|
||||
\`\`\`
|
||||
|
||||
**File changes:**
|
||||
\`\`\`
|
||||
Delegate to task subagent:
|
||||
- Execute: git diff --name-status 2>/dev/null
|
||||
- Parse: Changed file paths with status
|
||||
- Return: Modified: src/auth.ts, src/api.ts | Added: tests/auth.test.ts
|
||||
\`\`\`
|
||||
|
||||
**Current branch:**
|
||||
\`\`\`
|
||||
Execute directly (non-verbose):
|
||||
git branch --show-current 2>/dev/null
|
||||
\`\`\`
|
||||
|
||||
**Branch list:**
|
||||
\`\`\`
|
||||
Delegate to task subagent:
|
||||
- Execute: git branch -a 2>/dev/null | head -20
|
||||
- Parse: Local and remote branches
|
||||
- Return: 5 local branches | 12 remote branches | Current: feature/auth
|
||||
\`\`\`
|
||||
|
||||
### Success Criteria
|
||||
|
||||
✅ Main agent receives <50 tokens from git/Graphite operations
|
||||
✅ Verbose output stays in subagent context
|
||||
✅ User gets actionable summaries with next steps
|
||||
✅ Context window remains efficient (225x improvement)
|
||||
|
||||
### When NOT to Delegate
|
||||
|
||||
Execute directly in main context only if:
|
||||
- Output guaranteed <50 tokens (e.g., \`git branch --show-current\`)
|
||||
- User explicitly requests full output: \"show me the full diff\"
|
||||
- Command is non-verbose by nature
|
||||
|
||||
### Response Format
|
||||
|
||||
Always use consistent formatting:
|
||||
- Success: \`✓ [state] | [metric] | [action]\`
|
||||
- List: \`📋 [count] items: [item1], [item2], ...\`
|
||||
- Error: \`❌ [operation] failed | [reason] | Fix: [action]\`
|
||||
- Warning: \`⚠️ [concern] | [impact] | Consider: [action]\`
|
||||
|
||||
### Examples of Automatic Application
|
||||
|
||||
**User:** \"Check my Graphite stack\"
|
||||
**You:** [Automatically delegate to Task without asking]
|
||||
**Task subagent:** [Executes gt stack --json, parses, returns: ✓ feature/auth | 3 PRs | Review #456]
|
||||
**You to user:** \"Your stack has 3 PRs. Currently on feature/auth. Next step: review PR #456.\"
|
||||
|
||||
**User:** \"Show me the git log\"
|
||||
**You:** [Automatically delegate to Task]
|
||||
**Task subagent:** [Executes git log --oneline -10, formats]
|
||||
**You to user:** \"Last 10 commits: abc123 Add auth, def456 Fix API, ...\"
|
||||
|
||||
**User:** \"What branch am I on?\"
|
||||
**You:** [Execute directly: git branch --show-current]
|
||||
**You to user:** \"You're on feature/authentication\"
|
||||
|
||||
**User:** \"Show me all the changes\"
|
||||
**You:** [Automatically delegate to Task]
|
||||
**Task subagent:** [Executes git diff --stat, parses]
|
||||
**You to user:** \"Changes in 3 files: +45/-12 lines across auth.ts, api.ts, and auth.test.ts\"
|
||||
|
||||
---
|
||||
|
||||
**IMPORTANT: These patterns are ACTIVE for the entire session.**
|
||||
|
||||
Apply automatically without:
|
||||
- Requesting permission
|
||||
- Explaining the delegation process
|
||||
- Mentioning context optimization
|
||||
|
||||
Just deliver efficient, focused results transparently."
|
||||
|
||||
# Return JSON with context injection
|
||||
cat <<EOF
|
||||
{
|
||||
"hookSpecificOutput": {
|
||||
"hookEventName": "SessionStart",
|
||||
"additionalContext": $(echo "$CONTEXT" | jq -Rs .)
|
||||
}
|
||||
}
|
||||
EOF
|
||||
222
skills/graphite-skill/install.sh
Executable file
222
skills/graphite-skill/install.sh
Executable file
@@ -0,0 +1,222 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Installation script for Graphite Context-Optimized Plugin
|
||||
# Version: 2.0.0
|
||||
|
||||
set -e
|
||||
|
||||
# Colors for output
|
||||
GREEN='\033[0;32m'
|
||||
BLUE='\033[0;34m'
|
||||
YELLOW='\033[1;33m'
|
||||
RED='\033[0;31m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Get script directory
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
|
||||
echo -e "${BLUE}╔════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${BLUE}║ Graphite Context-Optimized Plugin Installer ║${NC}"
|
||||
echo -e "${BLUE}║ Version 2.0.0 ║${NC}"
|
||||
echo -e "${BLUE}╚════════════════════════════════════════════════╝${NC}"
|
||||
echo ""
|
||||
|
||||
# Parse arguments
|
||||
INSTALL_MODE=""
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
--global)
|
||||
INSTALL_MODE="global"
|
||||
shift
|
||||
;;
|
||||
--project)
|
||||
INSTALL_MODE="project"
|
||||
shift
|
||||
;;
|
||||
--help)
|
||||
echo "Usage: $0 [--global | --project]"
|
||||
echo ""
|
||||
echo "Options:"
|
||||
echo " --global Install globally for all your projects"
|
||||
echo " --project Install in current project (recommended for teams)"
|
||||
echo " --help Show this help message"
|
||||
echo ""
|
||||
echo "If no option is specified, you will be prompted to choose."
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
echo -e "${RED}Unknown option: $1${NC}"
|
||||
echo "Use --help for usage information"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Prompt for installation mode if not specified
|
||||
if [ -z "$INSTALL_MODE" ]; then
|
||||
echo "Choose installation mode:"
|
||||
echo " 1) Project (recommended for teams - installs in current directory)"
|
||||
echo " 2) Global (installs for all your projects)"
|
||||
echo ""
|
||||
read -p "Enter choice [1-2]: " choice
|
||||
|
||||
case $choice in
|
||||
1)
|
||||
INSTALL_MODE="project"
|
||||
;;
|
||||
2)
|
||||
INSTALL_MODE="global"
|
||||
;;
|
||||
*)
|
||||
echo -e "${RED}Invalid choice. Exiting.${NC}"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}Installation mode: $INSTALL_MODE${NC}"
|
||||
echo ""
|
||||
|
||||
# Set installation directory
|
||||
if [ "$INSTALL_MODE" = "global" ]; then
|
||||
INSTALL_DIR="$HOME/.claude/plugins/carbon"
|
||||
SETTINGS_FILE="$HOME/.claude/settings.json"
|
||||
else
|
||||
INSTALL_DIR="$PWD/.claude/plugins/carbon"
|
||||
SETTINGS_FILE="$PWD/.claude/settings.json"
|
||||
fi
|
||||
|
||||
# Check if git repository (for project mode)
|
||||
if [ "$INSTALL_MODE" = "project" ] && [ ! -d ".git" ]; then
|
||||
echo -e "${YELLOW}⚠️ Warning: Not a git repository${NC}"
|
||||
echo "This plugin works best in git repositories."
|
||||
echo ""
|
||||
read -p "Continue anyway? [y/N]: " continue
|
||||
if [[ ! $continue =~ ^[Yy]$ ]]; then
|
||||
echo "Installation cancelled."
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
# Create installation directory
|
||||
echo "Creating installation directory..."
|
||||
mkdir -p "$INSTALL_DIR/hooks"
|
||||
mkdir -p "$(dirname "$SETTINGS_FILE")"
|
||||
|
||||
# Copy files
|
||||
echo "Copying plugin files..."
|
||||
cp "$SCRIPT_DIR/plugin.json" "$INSTALL_DIR/"
|
||||
cp "$SCRIPT_DIR/settings.json" "$INSTALL_DIR/"
|
||||
cp "$SCRIPT_DIR/hooks/session-start.sh" "$INSTALL_DIR/hooks/"
|
||||
|
||||
# Make hook executable
|
||||
chmod +x "$INSTALL_DIR/hooks/session-start.sh"
|
||||
|
||||
# Copy agent template if project mode
|
||||
if [ "$INSTALL_MODE" = "project" ]; then
|
||||
if [ -f "$SCRIPT_DIR/agents/graphite-ops-template.md" ]; then
|
||||
mkdir -p "$PWD/.claude/agents"
|
||||
cp "$SCRIPT_DIR/agents/graphite-ops-template.md" "$PWD/.claude/agents/"
|
||||
echo "Copied agent template to .claude/agents/"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Update settings.json
|
||||
echo "Configuring hooks..."
|
||||
|
||||
# Create settings.json if it doesn't exist
|
||||
if [ ! -f "$SETTINGS_FILE" ]; then
|
||||
echo '{"hooks":{}}' > "$SETTINGS_FILE"
|
||||
fi
|
||||
|
||||
# Add hook configuration
|
||||
HOOK_CONFIG=$(cat "$INSTALL_DIR/settings.json")
|
||||
|
||||
# Use jq to merge if available, otherwise append
|
||||
if command -v jq &> /dev/null; then
|
||||
# Merge using jq
|
||||
TMP_FILE=$(mktemp)
|
||||
jq -s '.[0] * .[1]' "$SETTINGS_FILE" "$INSTALL_DIR/settings.json" > "$TMP_FILE"
|
||||
mv "$TMP_FILE" "$SETTINGS_FILE"
|
||||
else
|
||||
echo -e "${YELLOW}⚠️ jq not found - manual settings merge required${NC}"
|
||||
echo "Add the following to $SETTINGS_FILE:"
|
||||
echo ""
|
||||
cat "$INSTALL_DIR/settings.json"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
# Installation complete
|
||||
echo ""
|
||||
echo -e "${GREEN}✓ Installation complete!${NC}"
|
||||
echo ""
|
||||
|
||||
# Show next steps
|
||||
echo -e "${BLUE}Next Steps:${NC}"
|
||||
echo ""
|
||||
|
||||
if [ "$INSTALL_MODE" = "project" ]; then
|
||||
echo "1. Commit the plugin configuration to git:"
|
||||
echo -e " ${YELLOW}git add .claude/${NC}"
|
||||
echo -e " ${YELLOW}git commit -m 'Add Graphite context-optimization plugin'${NC}"
|
||||
echo ""
|
||||
echo "2. (Optional) Create custom agent:"
|
||||
echo -e " ${YELLOW}claude${NC}"
|
||||
echo -e " ${YELLOW}/agents create${NC}"
|
||||
echo " Name: graphite-ops"
|
||||
echo " Color: cyan"
|
||||
echo " Prompt: Load from ./agents/graphite-ops-template.md"
|
||||
echo ""
|
||||
echo "3. Test the installation:"
|
||||
echo -e " ${YELLOW}./test/verify-installation.sh${NC}"
|
||||
echo ""
|
||||
echo "4. Start using Claude Code:"
|
||||
echo -e " ${YELLOW}claude${NC}"
|
||||
echo -e " ${YELLOW}> \"Check my Graphite stack\"${NC}"
|
||||
else
|
||||
echo "1. Test the installation:"
|
||||
echo -e " ${YELLOW}cd your-git-project${NC}"
|
||||
echo -e " ${YELLOW}claude --debug hooks${NC}"
|
||||
echo ""
|
||||
echo "2. Start using Claude Code:"
|
||||
echo -e " ${YELLOW}claude${NC}"
|
||||
echo -e " ${YELLOW}> \"Check my Graphite stack\"${NC}"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}The plugin will automatically activate in git repositories!${NC}"
|
||||
echo ""
|
||||
|
||||
# Check for dependencies
|
||||
echo -e "${BLUE}Dependency Check:${NC}"
|
||||
echo ""
|
||||
|
||||
if command -v git &> /dev/null; then
|
||||
echo -e "${GREEN}✓${NC} git installed"
|
||||
else
|
||||
echo -e "${RED}✗${NC} git not found (required)"
|
||||
fi
|
||||
|
||||
if command -v gt &> /dev/null; then
|
||||
echo -e "${GREEN}✓${NC} Graphite CLI installed"
|
||||
else
|
||||
echo -e "${YELLOW}⚠${NC} Graphite CLI not found (optional)"
|
||||
echo " Install with: npm install -g @withgraphite/graphite-cli"
|
||||
fi
|
||||
|
||||
if command -v jq &> /dev/null; then
|
||||
echo -e "${GREEN}✓${NC} jq installed"
|
||||
else
|
||||
echo -e "${YELLOW}⚠${NC} jq not found (recommended)"
|
||||
echo " The hook uses jq for JSON processing"
|
||||
echo " Install with: brew install jq (macOS) or apt install jq (Linux)"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo -e "${BLUE}Documentation:${NC}"
|
||||
echo " docs/QUICKSTART.md - Get started in 5 minutes"
|
||||
echo " docs/USER-GUIDE.md - Complete usage guide"
|
||||
echo " docs/CUSTOM-AGENTS.md - Optional custom agent setup"
|
||||
echo ""
|
||||
echo -e "${GREEN}Installation successful! Happy coding! 🚀${NC}"
|
||||
200
skills/graphite-skill/references/quickstart.md
Normal file
200
skills/graphite-skill/references/quickstart.md
Normal file
@@ -0,0 +1,200 @@
|
||||
# Quick Start Guide
|
||||
|
||||
Get context-efficient git/Graphite workflows running in 5 minutes.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Git repository
|
||||
- Claude Code 2.0+
|
||||
- (Optional) Graphite CLI
|
||||
- (Optional) jq for JSON processing
|
||||
|
||||
## Installation
|
||||
|
||||
### Option 1: Automated Installation (Recommended)
|
||||
|
||||
```bash
|
||||
# Clone the repository
|
||||
git clone https://github.com/your-username/carbon.git
|
||||
cd carbon
|
||||
|
||||
# Run installer
|
||||
./install.sh --project
|
||||
|
||||
# The installer will:
|
||||
# - Copy files to .claude/plugins/
|
||||
# - Configure SessionStart hook
|
||||
# - Set up agent template
|
||||
```
|
||||
|
||||
### Option 2: Manual Installation
|
||||
|
||||
```bash
|
||||
# In your project
|
||||
mkdir -p .claude/plugins/carbon/hooks
|
||||
cd .claude/plugins/carbon
|
||||
|
||||
# Copy files
|
||||
cp /path/to/plugin/hooks/session-start.sh hooks/
|
||||
cp /path/to/plugin/settings.json .
|
||||
cp /path/to/plugin/plugin.json .
|
||||
|
||||
# Make hook executable
|
||||
chmod +x hooks/session-start.sh
|
||||
|
||||
# Copy agent template (optional)
|
||||
mkdir -p .claude/agents
|
||||
cp /path/to/plugin/./agents/graphite-ops-template.md .claude/agents/
|
||||
```
|
||||
|
||||
## Verification
|
||||
|
||||
```bash
|
||||
# Test hook execution
|
||||
bash .claude/plugins/carbon/hooks/session-start.sh
|
||||
|
||||
# Should output JSON with hookSpecificOutput
|
||||
|
||||
# Test in Claude Code
|
||||
claude --debug hooks
|
||||
|
||||
# Look for:
|
||||
# [SessionStart] Executing hook: session-start.sh
|
||||
# [SessionStart] Hook completed successfully
|
||||
```
|
||||
|
||||
## First Use
|
||||
|
||||
```bash
|
||||
# Start Claude Code
|
||||
claude
|
||||
|
||||
# Try it out (hook automatically active)
|
||||
> "Check my Graphite stack"
|
||||
|
||||
# Claude should automatically:
|
||||
# 1. Recognize verbose operation
|
||||
# 2. Delegate to Task subagent
|
||||
# 3. Return concise summary
|
||||
|
||||
# Expected response:
|
||||
# "✓ feature/auth | 3 PRs | Review #456"
|
||||
# NOT: [15KB of JSON]
|
||||
```
|
||||
|
||||
## Team Distribution
|
||||
|
||||
```bash
|
||||
# Commit the configuration
|
||||
git add .claude/
|
||||
git commit -m "Add Graphite context-optimization plugin"
|
||||
git push
|
||||
|
||||
# Team members pull and get automatic optimization
|
||||
git pull
|
||||
# Plugin activates automatically ✓
|
||||
```
|
||||
|
||||
## Optional: Custom Agent Setup
|
||||
|
||||
For enhanced UX with colored terminal output:
|
||||
|
||||
```bash
|
||||
# In Claude Code
|
||||
claude
|
||||
|
||||
# Create agent
|
||||
/agents create
|
||||
Name: graphite-ops
|
||||
Color: cyan
|
||||
Scope: project
|
||||
Prompt: Load from ./agents/graphite-ops-template.md
|
||||
|
||||
# Use it
|
||||
> "graphite-ops check my stack"
|
||||
|
||||
# Output appears with cyan color:
|
||||
graphite-ops [cyan]: ✓ feature/auth | 3 PRs | Review #456
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Hook not firing
|
||||
|
||||
```bash
|
||||
# Check permissions
|
||||
chmod +x .claude/plugins/carbon/hooks/session-start.sh
|
||||
|
||||
# Check settings.json exists
|
||||
ls -la .claude/settings.json
|
||||
|
||||
# Test manually
|
||||
bash .claude/plugins/carbon/hooks/session-start.sh | jq .
|
||||
```
|
||||
|
||||
### Context not appearing
|
||||
|
||||
```bash
|
||||
# Verify hook returns correct JSON
|
||||
bash .claude/plugins/carbon/hooks/session-start.sh | \
|
||||
jq '.hookSpecificOutput.hookEventName'
|
||||
|
||||
# Should output: "SessionStart"
|
||||
```
|
||||
|
||||
### Patterns not applied
|
||||
|
||||
Start Claude with debug mode:
|
||||
|
||||
```bash
|
||||
claude --debug hooks
|
||||
|
||||
# Check for:
|
||||
# - Hook execution
|
||||
# - Context injection
|
||||
# - Any error messages
|
||||
```
|
||||
|
||||
## Next Steps
|
||||
|
||||
- Read [User Guide](USER-GUIDE.md) for comprehensive usage
|
||||
- Read [Custom Agents](CUSTOM-AGENTS.md) for agent setup
|
||||
- See [examples/](../examples/) for configuration examples
|
||||
- Check [TROUBLESHOOTING.md](TROUBLESHOOTING.md) for common issues
|
||||
|
||||
## Quick Reference
|
||||
|
||||
### Common Operations
|
||||
|
||||
```bash
|
||||
# Stack status
|
||||
"Check my stack"
|
||||
→ ✓ feature/auth | 3 PRs | Review #456
|
||||
|
||||
# PR list
|
||||
"Show PRs needing review"
|
||||
→ 📋 2 PRs: #456 (Auth), #457 (Docs)
|
||||
|
||||
# Git log
|
||||
"Show me recent commits"
|
||||
→ Last 10: abc123 Feature, def456 Fix, ...
|
||||
|
||||
# Submit
|
||||
"Submit my stack"
|
||||
→ ✓ 3 PRs created | CI running | Ready for review
|
||||
```
|
||||
|
||||
### Using Custom Agent
|
||||
|
||||
```bash
|
||||
"graphite-ops check my stack"
|
||||
"graphite-ops show review queue"
|
||||
"graphite-ops submit"
|
||||
"graphite-ops navigate to next branch"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**That's it! You're ready to use context-efficient git/Graphite workflows.** 🚀
|
||||
|
||||
For more details, see the [complete User Guide](USER-GUIDE.md).
|
||||
282
skills/graphite-skill/references/readme.md
Normal file
282
skills/graphite-skill/references/readme.md
Normal file
@@ -0,0 +1,282 @@
|
||||
# Graphite Context-Optimized Plugin for Claude Code
|
||||
|
||||
[](https://opensource.org/licenses/MIT)
|
||||
[](https://code.claude.com)
|
||||
|
||||
**Stop drowning in verbose git/Graphite output.** This plugin automatically enables context-efficient workflows for all git and Graphite CLI operations in Claude Code.
|
||||
|
||||
## 🎯 What This Does
|
||||
|
||||
Transforms Claude Code's interaction with git/Graphite from context-polluting to context-efficient:
|
||||
|
||||
**Before (without plugin):**
|
||||
```bash
|
||||
You: "Check my Graphite stack"
|
||||
Claude: [Returns 15KB of JSON → 4,000+ tokens consumed]
|
||||
Context: Polluted, reasoning degraded
|
||||
```
|
||||
|
||||
**After (with plugin):**
|
||||
```bash
|
||||
You: "Check my Graphite stack"
|
||||
Claude: [Automatically delegates to Task subagent]
|
||||
Subagent: [Processes 15KB in isolated context]
|
||||
Claude: "✓ feature/auth | 3 PRs | Review #456"
|
||||
Context: Clean, 18 tokens used (225x more efficient)
|
||||
```
|
||||
|
||||
## ✨ Features
|
||||
|
||||
- **🔄 Automatic Delegation** - Task subagents handle verbose operations automatically
|
||||
- **🎨 Colored Agent Support** - Optional custom agent with cyan terminal output
|
||||
- **⚡ Zero Friction** - SessionStart hook activates patterns automatically
|
||||
- **📦 Team-Ready** - Git-trackable configuration for team distribution
|
||||
- **🎯 225x Efficiency** - Dramatic context window improvements
|
||||
- **🔧 Flexible** - Supports both Task tool (simple) and custom agents (enhanced UX)
|
||||
|
||||
## 🚀 Quick Start
|
||||
|
||||
### Installation
|
||||
|
||||
```bash
|
||||
# Clone this repository
|
||||
git clone https://github.com/your-username/carbon.git
|
||||
cd carbon
|
||||
|
||||
# Option 1: Install globally (affects all projects)
|
||||
./install.sh --global
|
||||
|
||||
# Option 2: Install in current project (recommended for teams)
|
||||
./install.sh --project
|
||||
|
||||
# Option 3: Manual installation
|
||||
mkdir -p .claude/plugins/carbon
|
||||
cp -r hooks settings.json plugin.json .claude/plugins/carbon/
|
||||
chmod +x .claude/plugins/carbon/hooks/session-start.sh
|
||||
```
|
||||
|
||||
### Verification
|
||||
|
||||
```bash
|
||||
# Test the installation
|
||||
./test/verify-installation.sh
|
||||
|
||||
# Start Claude Code with debug mode
|
||||
claude --debug hooks
|
||||
|
||||
# Test automatic delegation
|
||||
claude
|
||||
> "Check my Graphite stack"
|
||||
# Should automatically use Task delegation ✓
|
||||
```
|
||||
|
||||
## 📚 Documentation
|
||||
|
||||
- **[Quick Start Guide](docs/QUICKSTART.md)** - Get running in 5 minutes
|
||||
- **[User Guide](docs/USER-GUIDE.md)** - Complete usage documentation
|
||||
- **[Architecture](docs/ARCHITECTURE.md)** - How it works under the hood
|
||||
- **[Custom Agents](docs/CUSTOM-AGENTS.md)** - Optional colored agent setup
|
||||
- **[Troubleshooting](docs/TROUBLESHOOTING.md)** - Common issues and solutions
|
||||
|
||||
## 🎨 Two Approaches
|
||||
|
||||
### Task Tool (Default - Recommended for Most Users)
|
||||
|
||||
Zero setup, works immediately:
|
||||
|
||||
```bash
|
||||
You: "Check my stack"
|
||||
Claude: [Uses Task delegation automatically]
|
||||
```
|
||||
|
||||
**Characteristics:**
|
||||
- ⚡ No configuration needed
|
||||
- 📦 Works universally
|
||||
- 🎯 Full context isolation
|
||||
- ⚪ Generic terminal output
|
||||
|
||||
### Custom Agent (Optional - Power Users)
|
||||
|
||||
Enhanced UX with colored output:
|
||||
|
||||
```bash
|
||||
# One-time setup
|
||||
/agents create
|
||||
Name: graphite-ops
|
||||
Color: cyan
|
||||
Template: ./agents/graphite-ops-template.md
|
||||
|
||||
# Use with color
|
||||
You: "graphite-ops check my stack"
|
||||
graphite-ops [cyan]: ✓ feature/auth | 3 PRs | Review #456
|
||||
```
|
||||
|
||||
**Characteristics:**
|
||||
- 🎨 Colored terminal output
|
||||
- 👤 Consistent persona
|
||||
- 📁 Git-tracked definition
|
||||
- 🎯 Same context isolation
|
||||
|
||||
See [Custom Agents Guide](docs/CUSTOM-AGENTS.md) for setup instructions.
|
||||
|
||||
## 🔧 How It Works
|
||||
|
||||
### SessionStart Hook
|
||||
|
||||
The plugin uses a SessionStart hook to inject context-optimization patterns into Claude's context window automatically:
|
||||
|
||||
```
|
||||
1. Session starts → Hook fires
|
||||
2. Hook detects: git repo, Graphite CLI, custom agent
|
||||
3. Hook injects: ~800 tokens of patterns into context
|
||||
4. Claude knows: Use Task delegation for verbose operations
|
||||
5. User benefits: Automatic context efficiency, zero friction
|
||||
```
|
||||
|
||||
### Automatic Delegation
|
||||
|
||||
When you request git/Graphite operations, Claude automatically:
|
||||
|
||||
1. Recognizes the operation will return verbose output
|
||||
2. Delegates to Task subagent with explicit instructions
|
||||
3. Subagent executes with `--json` and `2>/dev/null`
|
||||
4. Subagent parses and returns summary <50 tokens
|
||||
5. You receive concise, actionable summary
|
||||
|
||||
**No manual invocation needed - it just works!**
|
||||
|
||||
## 📊 Efficiency Metrics
|
||||
|
||||
| Metric | Before (Raw CLI) | After (Plugin) | Improvement |
|
||||
|--------|------------------|----------------|-------------|
|
||||
| Tokens consumed | 4,108 | 18 | **225x** |
|
||||
| Context pollution | High | Minimal | **99.6% reduction** |
|
||||
| Response quality | Degraded | Optimal | **Focused reasoning** |
|
||||
| User effort | Manual patterns | Zero | **Automatic** |
|
||||
|
||||
## 🎯 Use Cases
|
||||
|
||||
### For Solo Developers
|
||||
|
||||
```bash
|
||||
# Just use Claude naturally
|
||||
"Check my stack"
|
||||
"Show PRs needing review"
|
||||
"Submit for review"
|
||||
|
||||
# Plugin handles context efficiency automatically
|
||||
```
|
||||
|
||||
### For Teams
|
||||
|
||||
```bash
|
||||
# One-time setup
|
||||
git clone <your-repo>
|
||||
./install.sh --project
|
||||
git add .claude/
|
||||
git commit -m "Add Graphite context-optimization"
|
||||
|
||||
# Team members pull and get:
|
||||
# ✓ Automatic context optimization
|
||||
# ✓ Consistent behavior
|
||||
# ✓ Zero per-developer setup
|
||||
```
|
||||
|
||||
### Supported Operations
|
||||
|
||||
**Graphite CLI:**
|
||||
- `gt stack` - Stack status with delegation
|
||||
- `gt pr list` - PR listing with filtering
|
||||
- `gt pr info` - Detailed PR data with parsing
|
||||
- `gt submit` - Submission with confirmation
|
||||
- All other verbose gt commands
|
||||
|
||||
**Git:**
|
||||
- `git log --graph` - Commit history with summarization
|
||||
- `git diff` - Changes with statistics
|
||||
- `git status` - Status with file grouping
|
||||
- All other verbose git commands
|
||||
|
||||
## 🛠️ Configuration
|
||||
|
||||
### Default Configuration
|
||||
|
||||
The plugin works out-of-box with sensible defaults. No configuration required.
|
||||
|
||||
### Custom Configuration
|
||||
|
||||
Adjust behavior by editing `.claude/plugins/carbon/config.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"contextTokens": 800,
|
||||
"delegationThreshold": 100,
|
||||
"autoDetectGraphite": true,
|
||||
"autoDetectCustomAgent": true,
|
||||
"enableTaskDelegation": true,
|
||||
"enableCustomAgent": true
|
||||
}
|
||||
```
|
||||
|
||||
See [Configuration Guide](docs/CONFIGURATION.md) for details.
|
||||
|
||||
## 🤝 Contributing
|
||||
|
||||
Contributions welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
|
||||
|
||||
### Development Setup
|
||||
|
||||
```bash
|
||||
# Clone repository
|
||||
git clone https://github.com/your-username/carbon.git
|
||||
cd carbon
|
||||
|
||||
# Install dependencies (jq required)
|
||||
# Ubuntu/Debian: sudo apt install jq
|
||||
# macOS: brew install jq
|
||||
|
||||
# Run tests
|
||||
./test/run-tests.sh
|
||||
|
||||
# Make changes
|
||||
# ...
|
||||
|
||||
# Test your changes
|
||||
./test/verify-installation.sh
|
||||
```
|
||||
|
||||
## 📝 License
|
||||
|
||||
MIT License - see [LICENSE](LICENSE) for details.
|
||||
|
||||
## 🙏 Acknowledgments
|
||||
|
||||
- [Graphite](https://graphite.dev) - Excellent stacked diff workflow tool
|
||||
- [Claude Code](https://code.claude.com) - Powerful AI-assisted development
|
||||
- Community contributors who provided feedback and testing
|
||||
|
||||
## 📮 Support
|
||||
|
||||
- **Issues**: [GitHub Issues](https://github.com/your-username/carbon/issues)
|
||||
- **Discussions**: [GitHub Discussions](https://github.com/your-username/carbon/discussions)
|
||||
- **Documentation**: [docs/](docs/)
|
||||
|
||||
## 🚦 Status
|
||||
|
||||
- ✅ Production-ready
|
||||
- ✅ Actively maintained
|
||||
- ✅ Tested with Claude Code 2.0+
|
||||
- ✅ Compatible with Graphite CLI 1.0+
|
||||
|
||||
## 📈 Roadmap
|
||||
|
||||
- [ ] Additional git workflow patterns
|
||||
- [ ] Integration with other git tools (gh, lab)
|
||||
- [ ] Advanced custom agent templates
|
||||
- [ ] VSCode extension integration
|
||||
- [ ] Metrics dashboard for context efficiency
|
||||
|
||||
---
|
||||
|
||||
**Install once → Benefit forever → Share with team → Zero-friction context efficiency!** 🚀
|
||||
|
||||
146
skills/graphite-skill/references/team-configuration.md
Normal file
146
skills/graphite-skill/references/team-configuration.md
Normal file
@@ -0,0 +1,146 @@
|
||||
# Example: Team Configuration with Custom Agent
|
||||
|
||||
This example shows a complete team configuration with:
|
||||
- SessionStart hook enabled
|
||||
- Custom graphite-ops agent configured
|
||||
- Team-shared via git
|
||||
|
||||
## Directory Structure
|
||||
|
||||
```
|
||||
your-project/
|
||||
├── .git/
|
||||
└── .claude/
|
||||
├── settings.json # Hook configuration
|
||||
├── agents/
|
||||
│ └── graphite-ops.md # Custom agent definition
|
||||
└── plugins/
|
||||
└── carbon/
|
||||
├── hooks/
|
||||
│ └── session-start.sh # Hook script
|
||||
├── plugin.json
|
||||
└── settings.json
|
||||
```
|
||||
|
||||
## settings.json
|
||||
|
||||
```json
|
||||
{
|
||||
"hooks": {
|
||||
"SessionStart": [
|
||||
{
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "$CLAUDE_PROJECT_DIR/.claude/plugins/carbon/hooks/session-start.sh",
|
||||
"timeout": 10
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## graphite-ops.md (Custom Agent)
|
||||
|
||||
```markdown
|
||||
---
|
||||
name: graphite-ops
|
||||
description: Context-efficient Graphite and git operations
|
||||
agent-color: cyan
|
||||
tools:
|
||||
- bash_tool
|
||||
- view
|
||||
- str_replace
|
||||
---
|
||||
|
||||
[... agent prompt from template ...]
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
### For Team Lead (Setup)
|
||||
|
||||
```bash
|
||||
# Install plugin
|
||||
./install.sh --project
|
||||
|
||||
# Create custom agent
|
||||
claude
|
||||
/agents create
|
||||
Name: graphite-ops
|
||||
Color: cyan
|
||||
Prompt: Load from ./agents/graphite-ops-template.md
|
||||
|
||||
# Commit configuration
|
||||
git add .claude/
|
||||
git commit -m "Add Graphite context-optimization plugin"
|
||||
git push
|
||||
```
|
||||
|
||||
### For Team Members (Automatic)
|
||||
|
||||
```bash
|
||||
# Pull repository
|
||||
git pull
|
||||
|
||||
# Plugin activates automatically!
|
||||
claude
|
||||
> "Check my stack"
|
||||
# Uses Task delegation automatically ✓
|
||||
|
||||
# Or use custom agent
|
||||
> "graphite-ops check my stack"
|
||||
# Gets cyan-colored output ✓
|
||||
```
|
||||
|
||||
## Benefits for Teams
|
||||
|
||||
✅ **Zero per-developer setup** - Pull repo → get optimization
|
||||
✅ **Consistent behavior** - Everyone uses same patterns
|
||||
✅ **Visual organization** - Colored agents for easy recognition
|
||||
✅ **Git-tracked** - Configuration version-controlled
|
||||
|
||||
## Customization
|
||||
|
||||
### Adjust Context Size
|
||||
|
||||
Edit `hooks/session-start.sh`:
|
||||
|
||||
```bash
|
||||
# Reduce injected context from ~800 to ~400 tokens
|
||||
CONTEXT="# Context-Optimization Active
|
||||
|
||||
For git/Graphite operations >100 tokens:
|
||||
- Delegate to Task subagent
|
||||
- Return: ✓ [state] | [count] | [action]"
|
||||
```
|
||||
|
||||
### Project-Specific Patterns
|
||||
|
||||
Add custom patterns for your team:
|
||||
|
||||
```bash
|
||||
CONTEXT+="
|
||||
|
||||
## Team-Specific Patterns
|
||||
- Always run tests before submitting stack
|
||||
- Check Jira ticket in commit messages
|
||||
- Use branch naming: feature/PROJ-123-description"
|
||||
```
|
||||
|
||||
### Multiple Agents
|
||||
|
||||
Create specialized agents for different workflows:
|
||||
|
||||
```bash
|
||||
# Git operations
|
||||
/agents create → git-ops [green]
|
||||
|
||||
# PR reviews
|
||||
/agents create → review-ops [blue]
|
||||
|
||||
# CI/CD
|
||||
/agents create → deploy-ops [red]
|
||||
```
|
||||
15
skills/graphite-skill/settings.json
Normal file
15
skills/graphite-skill/settings.json
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"hooks": {
|
||||
"SessionStart": [
|
||||
{
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "$CLAUDE_PROJECT_DIR/.claude/plugins/carbon/hooks/session-start.sh",
|
||||
"timeout": 10
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
237
skills/graphite-skill/test/verify-installation.sh
Executable file
237
skills/graphite-skill/test/verify-installation.sh
Executable file
@@ -0,0 +1,237 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Installation Verification Script
|
||||
# Tests that the Graphite Context-Optimized Plugin is properly installed
|
||||
|
||||
set -e
|
||||
|
||||
# Colors
|
||||
GREEN='\033[0;32m'
|
||||
RED='\033[0;31m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m'
|
||||
|
||||
# Test counters
|
||||
PASS=0
|
||||
FAIL=0
|
||||
WARN=0
|
||||
|
||||
echo -e "${BLUE}╔════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${BLUE}║ Graphite Context-Optimized Plugin Verifier ║${NC}"
|
||||
echo -e "${BLUE}║ Version 2.0.0 ║${NC}"
|
||||
echo -e "${BLUE}╚════════════════════════════════════════════════╝${NC}"
|
||||
echo ""
|
||||
|
||||
# Helper functions
|
||||
print_test() {
|
||||
echo -e "${BLUE}Testing:${NC} $1"
|
||||
}
|
||||
|
||||
print_pass() {
|
||||
echo -e " ${GREEN}✓${NC} $1"
|
||||
PASS=$((PASS + 1))
|
||||
}
|
||||
|
||||
print_fail() {
|
||||
echo -e " ${RED}✗${NC} $1"
|
||||
[ -n "$2" ] && echo -e " ${RED}$2${NC}"
|
||||
FAIL=$((FAIL + 1))
|
||||
}
|
||||
|
||||
print_warn() {
|
||||
echo -e " ${YELLOW}⚠${NC} $1"
|
||||
[ -n "$2" ] && echo -e " ${YELLOW}$2${NC}"
|
||||
WARN=$((WARN + 1))
|
||||
}
|
||||
|
||||
# Test 1: Git repository
|
||||
print_test "Git repository detection"
|
||||
if [ -d ".git" ]; then
|
||||
print_pass "Git repository found"
|
||||
else
|
||||
print_warn "Not a git repository" "Plugin works best in git repos"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Test 2: Plugin directory
|
||||
print_test "Plugin directory structure"
|
||||
if [ -d ".claude/plugins/carbon" ]; then
|
||||
print_pass "Plugin directory exists"
|
||||
else
|
||||
print_fail "Plugin directory missing" "Run: ./install.sh --project"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Test 3: Hook file
|
||||
print_test "SessionStart hook file"
|
||||
HOOK_PATH=".claude/plugins/carbon/hooks/session-start.sh"
|
||||
if [ -f "$HOOK_PATH" ]; then
|
||||
print_pass "Hook file exists"
|
||||
|
||||
# Check permissions
|
||||
if [ -x "$HOOK_PATH" ]; then
|
||||
print_pass "Hook is executable"
|
||||
else
|
||||
print_fail "Hook not executable" "Run: chmod +x $HOOK_PATH"
|
||||
fi
|
||||
else
|
||||
print_fail "Hook file missing" "Run: ./install.sh --project"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Test 4: Settings file
|
||||
print_test "Settings configuration"
|
||||
SETTINGS_PATH=".claude/settings.json"
|
||||
if [ -f "$SETTINGS_PATH" ]; then
|
||||
print_pass "Settings file exists"
|
||||
|
||||
# Check for SessionStart hook
|
||||
if grep -q "SessionStart" "$SETTINGS_PATH" 2>/dev/null; then
|
||||
print_pass "SessionStart hook configured"
|
||||
else
|
||||
print_fail "SessionStart hook not in settings" "Check settings.json configuration"
|
||||
fi
|
||||
else
|
||||
print_fail "Settings file missing" "Run: ./install.sh --project"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Test 5: JSON validity
|
||||
print_test "JSON file validity"
|
||||
if command -v jq &> /dev/null; then
|
||||
# Check plugin.json
|
||||
if [ -f ".claude/plugins/carbon/plugin.json" ]; then
|
||||
if jq empty .claude/plugins/carbon/plugin.json 2>/dev/null; then
|
||||
print_pass "plugin.json is valid"
|
||||
else
|
||||
print_fail "plugin.json has invalid syntax"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Check settings.json
|
||||
if [ -f "$SETTINGS_PATH" ]; then
|
||||
if jq empty "$SETTINGS_PATH" 2>/dev/null; then
|
||||
print_pass "settings.json is valid"
|
||||
else
|
||||
print_fail "settings.json has invalid syntax"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
print_warn "jq not installed" "Cannot validate JSON syntax"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Test 6: Hook execution
|
||||
print_test "Hook execution test"
|
||||
if [ -f "$HOOK_PATH" ] && [ -x "$HOOK_PATH" ]; then
|
||||
export CLAUDE_PROJECT_DIR="$PWD"
|
||||
|
||||
if HOOK_OUTPUT=$(bash "$HOOK_PATH" 2>&1); then
|
||||
print_pass "Hook executes successfully"
|
||||
|
||||
# Test JSON output
|
||||
if command -v jq &> /dev/null; then
|
||||
if echo "$HOOK_OUTPUT" | jq empty 2>/dev/null; then
|
||||
print_pass "Hook output is valid JSON"
|
||||
|
||||
# Check structure
|
||||
if echo "$HOOK_OUTPUT" | jq -e '.hookSpecificOutput.hookEventName == "SessionStart"' &> /dev/null; then
|
||||
print_pass "Hook output structure correct"
|
||||
else
|
||||
print_fail "Hook output structure incorrect"
|
||||
fi
|
||||
|
||||
# Check context
|
||||
if echo "$HOOK_OUTPUT" | jq -e '.hookSpecificOutput.additionalContext' &> /dev/null; then
|
||||
CONTEXT_LEN=$(echo "$HOOK_OUTPUT" | jq -r '.hookSpecificOutput.additionalContext' | wc -c)
|
||||
print_pass "additionalContext present ($CONTEXT_LEN chars)"
|
||||
else
|
||||
print_fail "additionalContext missing"
|
||||
fi
|
||||
else
|
||||
print_fail "Hook output is not valid JSON"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
print_fail "Hook execution failed" "Test manually: bash $HOOK_PATH"
|
||||
fi
|
||||
else
|
||||
print_fail "Cannot test hook" "File missing or not executable"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Test 7: Dependencies
|
||||
print_test "Dependency check"
|
||||
|
||||
if command -v git &> /dev/null; then
|
||||
GIT_VERSION=$(git --version | cut -d' ' -f3)
|
||||
print_pass "git installed ($GIT_VERSION)"
|
||||
else
|
||||
print_fail "git not found" "Required dependency"
|
||||
fi
|
||||
|
||||
if command -v gt &> /dev/null; then
|
||||
GT_VERSION=$(gt --version 2>&1 | head -1 || echo "unknown")
|
||||
print_pass "Graphite CLI installed ($GT_VERSION)"
|
||||
else
|
||||
print_warn "Graphite CLI not found" "Install: npm install -g @withgraphite/graphite-cli"
|
||||
fi
|
||||
|
||||
if command -v jq &> /dev/null; then
|
||||
JQ_VERSION=$(jq --version 2>&1)
|
||||
print_pass "jq installed ($JQ_VERSION)"
|
||||
else
|
||||
print_warn "jq not found" "Recommended for JSON processing"
|
||||
fi
|
||||
|
||||
if command -v claude &> /dev/null; then
|
||||
print_pass "Claude Code CLI found"
|
||||
else
|
||||
print_warn "Claude Code CLI not in PATH"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Test 8: Agent template
|
||||
print_test "Custom agent template"
|
||||
AGENT_TEMPLATE="./agents/graphite-ops-template.md"
|
||||
if [ -f "$AGENT_TEMPLATE" ]; then
|
||||
print_pass "Agent template available"
|
||||
echo -e " ${BLUE}Create agent with: /agents create${NC}"
|
||||
else
|
||||
print_warn "Agent template not found" "Optional feature - not required"
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# Summary
|
||||
echo -e "${BLUE}════════════════════════════════════════════════${NC}"
|
||||
echo -e "${BLUE}Summary:${NC}"
|
||||
echo -e " ${GREEN}Passed:${NC} $PASS"
|
||||
echo -e " ${YELLOW}Warnings:${NC} $WARN"
|
||||
echo -e " ${RED}Failed:${NC} $FAIL"
|
||||
echo -e "${BLUE}════════════════════════════════════════════════${NC}"
|
||||
echo ""
|
||||
|
||||
# Final verdict
|
||||
if [ $FAIL -eq 0 ]; then
|
||||
echo -e "${GREEN}✓ Plugin is properly installed and ready to use!${NC}"
|
||||
echo ""
|
||||
echo -e "${BLUE}Next steps:${NC}"
|
||||
echo " 1. Start Claude Code: claude --debug hooks"
|
||||
echo " 2. Verify hook fires: Check for [SessionStart] messages"
|
||||
echo " 3. Test delegation: \"Check my Graphite stack\""
|
||||
echo " 4. (Optional) Create custom agent: /agents create"
|
||||
echo ""
|
||||
echo -e "${GREEN}The plugin will automatically optimize git/Graphite operations!${NC}"
|
||||
exit 0
|
||||
else
|
||||
echo -e "${RED}✗ Installation issues detected${NC}"
|
||||
echo ""
|
||||
echo "Fix the failed tests above, then run this script again."
|
||||
echo ""
|
||||
echo "For help, see:"
|
||||
echo " - docs/QUICKSTART.md"
|
||||
echo " - docs/TROUBLESHOOTING.md"
|
||||
echo " - https://github.com/your-username/carbon/issues"
|
||||
exit 1
|
||||
fi
|
||||
Reference in New Issue
Block a user