Back to Ruflo

@claude-flow/plugin-gastown-bridge

v3/plugins/gastown-bridge/README.md

3.6.3020.9 KB
Original Source

@claude-flow/plugin-gastown-bridge

WASM-Accelerated Bridge to Steve Yegge's Gas Town Multi-Agent Orchestrator

Introduction

The Gas Town Bridge Plugin brings Steve Yegge's powerful Gas Town multi-agent orchestrator to Claude Flow V3. Gas Town introduces battle-tested concepts for durable workflow execution that complement Claude Flow's swarm intelligence.

What is Gas Town?

Gas Town is a 75,000-line Go codebase that implements:

  • Beads - Git-backed issue tracking with graph semantics
  • Formulas - TOML-defined workflows (convoy, workflow, expansion, aspect)
  • Convoys - Work-order tracking for "slung" work between agents
  • GUPP - Gastown Universal Propulsion Principle for crash-resilient execution
  • Molecules/Wisps - Chained work units for durable, resumable workflows

Why This Plugin?

ChallengeSolution
Gas Town is Go-onlyCLI bridge wraps gt and bd commands
Go can't compile to WASM (syscalls)Hybrid architecture: CLI for I/O, WASM for compute
Formula parsing is slow in JSRust→WASM provides 352x speedup
Graph operations bottleneckWASM DAG ops are 150x faster

Features

πŸš€ WASM-Accelerated Computation

OperationJavaScriptWASMSpeedup
Formula parse (TOML→AST)53ms0.15ms352x
Variable cooking35ms0.1ms350x
Batch cook (10 formulas)350ms1ms350x
DAG topological sort75ms0.5ms150x
Cycle detection45ms0.3ms150x
Critical path analysis120ms0.8ms150x
Pattern search (HNSW)5000ms5ms1000x-12500x

πŸ”— 20 MCP Tools

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    MCP Tool Categories                       β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Beads (5)      β”‚  Convoy (3)     β”‚  Formula (4)            β”‚
β”‚  β”œβ”€ create      β”‚  β”œβ”€ create      β”‚  β”œβ”€ list                β”‚
β”‚  β”œβ”€ ready       β”‚  β”œβ”€ status      β”‚  β”œβ”€ cook (WASM)         β”‚
β”‚  β”œβ”€ show        β”‚  └─ track       β”‚  β”œβ”€ execute             β”‚
β”‚  β”œβ”€ dep         β”‚                 β”‚  └─ create              β”‚
β”‚  └─ sync        β”‚                 β”‚                         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Orchestration  β”‚  WASM (5)       β”‚                         β”‚
β”‚  β”œβ”€ sling       β”‚  β”œβ”€ parse       β”‚                         β”‚
β”‚  β”œβ”€ agents      β”‚  β”œβ”€ resolve     β”‚                         β”‚
β”‚  └─ mail        β”‚  β”œβ”€ cook_batch  β”‚                         β”‚
β”‚                 β”‚  β”œβ”€ match       β”‚                         β”‚
β”‚                 β”‚  └─ optimize    β”‚                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ›‘οΈ Security-First Design

  • Input Validation: Zod schemas for all parameters
  • Command Injection Prevention: Allowlist-only CLI execution
  • Path Traversal Protection: Strict path validation
  • No Shell Execution: Uses execFile with shell: false

πŸ”„ Bidirectional Sync

Seamlessly sync between Gas Town's Beads and Claude Flow's AgentDB:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     SyncBridge      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              β”‚  ←───────────────→  β”‚              β”‚
β”‚    Beads     β”‚   Conflict Res.     β”‚   AgentDB    β”‚
β”‚   (JSONL)    β”‚   β€’ beads-wins      β”‚   (SQLite)   β”‚
β”‚              β”‚   β€’ newest-wins     β”‚              β”‚
β”‚              β”‚   β€’ merge           β”‚              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Enhancement & Comparison

Gas Town vs Claude Flow V3

FeatureGas TownClaude Flow V3With This Plugin
Issue TrackingBeads (Git-backed)AgentDBUnified sync
WorkflowsTOML FormulasTypeScriptBoth supported
Agent RolesMayor, Polecats, CrewHierarchical swarmInteroperable
Crash RecoveryGUPP hooksSession persistenceCombined
Work DistributionSlingingTask orchestrationBridge via sling tool
Pattern SearchN/AHNSW (slow JS)HNSW WASM (1000x faster)

Performance Comparison

MetricPure JavaScriptThis Plugin (WASM)Improvement
Formula parse53ms0.15ms352x faster
100-node DAG sort75ms0.5ms150x faster
Pattern search (10k)5000ms5ms1000x faster
Memory usage48MB12MB4x reduction
Startup time850ms120ms7x faster

Architecture Comparison

ApproachProsConsThis Plugin
Full TypeScript PortNative, no deps75k lines to port❌
Goβ†’WASM CompileReuse codeSyscalls block it❌
Pure CLI BridgeSimpleSlow for computePartial βœ“
Hybrid CLI+WASMBest of bothTwo codebasesβœ… Selected

Installation

bash
# Install via Claude Flow CLI (recommended)
npx claude-flow@latest plugins install -n @claude-flow/plugin-gastown-bridge

# Or install directly via npm
npm install @claude-flow/plugin-gastown-bridge

# Prerequisites: Gas Town and Beads CLI (optional - for full CLI integration)
# See: https://github.com/steveyegge/gastown
go install github.com/steveyegge/gastown/cmd/gt@latest
go install github.com/steveyegge/beads/cmd/bd@latest

Usage

Basic Setup

typescript
import { GasTownBridgePlugin } from '@claude-flow/plugin-gastown-bridge';

// Initialize the plugin
const plugin = new GasTownBridgePlugin({
  gtPath: '/usr/local/bin/gt',  // Optional: path to gt CLI
  bdPath: '/usr/local/bin/bd',  // Optional: path to bd CLI
  wasmEnabled: true,             // Enable WASM acceleration
});

// Register with Claude Flow
await claudeFlow.registerPlugin(plugin);

Using MCP Tools

typescript
// Create a bead (issue)
const bead = await plugin.tools.gt_beads_create({
  title: 'Implement feature X',
  description: 'Full description here',
  priority: 2,
  labels: ['feature', 'v3'],
});

// List ready beads (no blockers)
const ready = await plugin.tools.gt_beads_ready({
  limit: 10,
  rig: 'main',
});

// Cook a formula (WASM-accelerated, 352x faster)
const cooked = await plugin.tools.gt_formula_cook({
  formula: 'implement-feature',
  vars: {
    feature_name: 'Authentication',
    target_module: 'src/auth',
  },
});

// Sling work to an agent
await plugin.tools.gt_sling({
  bead_id: 'gt-abc123',
  target: 'polecat',
  formula: 'code-review',
});

WASM-Accelerated Operations

typescript
// Parse formula (352x faster than JS)
const ast = await plugin.tools.gt_wasm_parse_formula({
  content: `
    [formula]
    name = "deploy-service"
    type = "convoy"

    [[legs]]
    id = "build"
    title = "Build the service"
  `,
});

// Resolve dependencies (150x faster)
const sorted = await plugin.tools.gt_wasm_resolve_deps({
  beads: beadList,
  action: 'topo_sort',
});

// Batch cook formulas (352x faster)
const cooked = await plugin.tools.gt_wasm_cook_batch({
  formulas: formulaList,
  vars: [{ env: 'prod' }, { env: 'staging' }],
});

// Find similar patterns (1000x-12500x faster)
const matches = await plugin.tools.gt_wasm_match_pattern({
  query: 'authentication flow',
  candidates: formulaNames,
  k: 5,
});

Sync Between Beads and AgentDB

typescript
// Sync beads to AgentDB
await plugin.tools.gt_beads_sync({
  direction: 'push',
  rig: 'main',
  namespace: 'project-x',
});

// Pull from AgentDB to Beads
await plugin.tools.gt_beads_sync({
  direction: 'pull',
  conflictStrategy: 'newest-wins',
});

// Bidirectional sync
await plugin.tools.gt_beads_sync({
  direction: 'both',
  conflictStrategy: 'merge',
});

Tutorial

<details> <summary><strong>πŸ“– Tutorial 1: Your First Gas Town Integration</strong></summary>

Step 1: Verify Prerequisites

bash
# Check Gas Town CLI
gt --version

# Check Beads CLI
bd --version

# Both should output version numbers

Step 2: Initialize Plugin in Your Project

typescript
// claude-flow.config.ts
import { defineConfig } from 'claude-flow';
import { GasTownBridgePlugin } from '@claude-flow/plugin-gastown-bridge';

export default defineConfig({
  plugins: [
    new GasTownBridgePlugin({
      wasmEnabled: true,
    }),
  ],
});

Step 3: Create Your First Bead

typescript
const bead = await claudeFlow.mcp.call('gt_beads_create', {
  title: 'Hello Gas Town',
  description: 'My first bead from Claude Flow!',
  priority: 3,
  labels: ['tutorial'],
});

console.log(`Created bead: ${bead.id}`);
// Output: Created bead: gt-a1b2c3

Step 4: List Ready Work

typescript
const ready = await claudeFlow.mcp.call('gt_beads_ready', {
  limit: 5,
});

console.log('Ready beads:', ready.beads.map(b => b.title));
</details> <details> <summary><strong>πŸ“– Tutorial 2: Working with Formulas</strong></summary>

Understanding Formula Types

TypePurposeExample
convoyMulti-leg work ordersFeature implementation
workflowStep-by-step processesCI/CD pipeline
expansionGenerate multiple beadsTest suite creation
aspectCross-cutting concernsLogging, metrics

Creating a Custom Formula

typescript
// Create a code review formula
await claudeFlow.mcp.call('gt_formula_create', {
  name: 'code-review-flow',
  type: 'workflow',
  steps: [
    {
      id: 'checkout',
      title: 'Checkout branch',
      description: 'Clone and checkout the PR branch',
    },
    {
      id: 'lint',
      title: 'Run linters',
      description: 'Execute ESLint and Prettier',
      needs: ['checkout'],
    },
    {
      id: 'test',
      title: 'Run tests',
      description: 'Execute test suite',
      needs: ['checkout'],
    },
    {
      id: 'review',
      title: 'Code review',
      description: 'Manual code review',
      needs: ['lint', 'test'],
    },
  ],
  vars: {
    branch: { type: 'string', required: true },
    reviewer: { type: 'string', default: 'auto' },
  },
});

Cooking a Formula (WASM-Accelerated)

typescript
// Cook the formula with variables
const cooked = await claudeFlow.mcp.call('gt_formula_cook', {
  formula: 'code-review-flow',
  vars: {
    branch: 'feature/auth',
    reviewer: '@alice',
  },
});

// cooked.steps now have variables substituted
console.log(cooked.steps[3].description);
// Output: "Manual code review by @alice"
</details> <details> <summary><strong>πŸ“– Tutorial 3: Convoy Management</strong></summary>

What is a Convoy?

A convoy is a "work order" that tracks a set of related beads through their lifecycle. Think of it as a sprint or milestone.

Creating a Convoy

typescript
// Create convoy for a feature
const convoy = await claudeFlow.mcp.call('gt_convoy_create', {
  name: 'v2.0-release',
  description: 'Version 2.0 release convoy',
  issues: ['gt-abc1', 'gt-abc2', 'gt-abc3'],
});

console.log(`Convoy created: ${convoy.id}`);

Tracking Convoy Progress

typescript
// Check convoy status
const status = await claudeFlow.mcp.call('gt_convoy_status', {
  convoy_id: convoy.id,
  detailed: true,
});

console.log(`Progress: ${status.progress}%`);
console.log(`Completed: ${status.completed}/${status.total}`);

Optimizing Convoy Execution (WASM)

typescript
// Get optimal execution order (150x faster with WASM)
const optimized = await claudeFlow.mcp.call('gt_wasm_optimize_convoy', {
  convoy_id: convoy.id,
  strategy: 'parallel', // or 'serial', 'hybrid'
});

console.log('Execution plan:', optimized.plan);
// Output shows which beads can run in parallel
</details> <details> <summary><strong>πŸ“– Tutorial 4: Slinging Work to Agents</strong></summary>

Gas Town Agent Roles

RolePurpose
mayorCoordinator, assigns work
polecatGeneral worker agents
crewSpecialized team members
refineryProcessing and transformation
witnessVerification and validation
deaconAdministrative tasks
dogGuard duties, security

Slinging Work

typescript
// Sling a bead to a polecat for coding
await claudeFlow.mcp.call('gt_sling', {
  bead_id: 'gt-abc123',
  target: 'polecat',
  formula: 'implement-feature',
});

// The work is now "on the polecat's hook"
// GUPP: "If work is on your hook, YOU MUST RUN IT"

Listing Available Agents

typescript
const agents = await claudeFlow.mcp.call('gt_agents', {
  rig: 'main',
  role: 'polecat',
  include_inactive: false,
});

agents.forEach(agent => {
  console.log(`${agent.name}: ${agent.status} (${agent.workload} tasks)`);
});
</details> <details> <summary><strong>πŸ“– Tutorial 5: Beads-AgentDB Synchronization</strong></summary>

Sync Strategies

StrategyUse Case
pushExport beads to AgentDB
pullImport from AgentDB to Beads
bothBidirectional sync

Conflict Resolution

ResolutionBehavior
beads-winsBeads data overwrites AgentDB
agentdb-winsAgentDB data overwrites Beads
newest-winsMost recent modification wins
mergeCombine non-conflicting fields
manualQueue conflicts for manual resolution

Example: Production Sync Workflow

typescript
// Morning: Pull overnight changes from shared AgentDB
await claudeFlow.mcp.call('gt_beads_sync', {
  direction: 'pull',
  rig: 'production',
  conflictStrategy: 'newest-wins',
});

// During work: Push local changes
await claudeFlow.mcp.call('gt_beads_sync', {
  direction: 'push',
  rig: 'production',
  namespace: 'team-alpha',
});

// End of day: Full bidirectional sync
const result = await claudeFlow.mcp.call('gt_beads_sync', {
  direction: 'both',
  conflictStrategy: 'merge',
});

console.log(`Synced: ${result.pushed} pushed, ${result.pulled} pulled`);
console.log(`Conflicts: ${result.conflicts.length}`);
</details> <details> <summary><strong>πŸ“– Tutorial 6: WASM Performance Optimization</strong></summary>

When to Use WASM Tools

Use WASMUse CLI
Parsing formulasCreating beads
Graph operationsFile I/O
Pattern matchingSQLite queries
Batch processingAgent communication

Batch Processing for Maximum Performance

typescript
// Instead of this (slow):
for (const formula of formulas) {
  await claudeFlow.mcp.call('gt_formula_cook', {
    formula: formula.name,
    vars: formula.vars,
  });
}

// Do this (352x faster):
const results = await claudeFlow.mcp.call('gt_wasm_cook_batch', {
  formulas: formulas.map(f => f.name),
  vars: formulas.map(f => f.vars),
});

Profiling WASM Performance

typescript
// All WASM tools return timing metrics
const result = await claudeFlow.mcp.call('gt_wasm_parse_formula', {
  content: formulaToml,
});

console.log(`Parse time: ${result.durationMs}ms`);
// Output: Parse time: 0.14ms
</details>

API Reference

Plugin Configuration

typescript
interface GasTownBridgeConfig {
  /** Path to gt CLI (default: auto-detect) */
  gtPath?: string;

  /** Path to bd CLI (default: auto-detect) */
  bdPath?: string;

  /** Enable WASM acceleration (default: true) */
  wasmEnabled?: boolean;

  /** Default rig for operations */
  defaultRig?: string;

  /** Sync conflict resolution strategy */
  conflictStrategy?: 'beads-wins' | 'agentdb-wins' | 'newest-wins' | 'merge' | 'manual';

  /** CLI execution timeout in ms (default: 30000) */
  timeout?: number;
}

Tool Reference

See MCP Tools Documentation for complete API reference.

Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                      Claude Flow V3 Plugin Host                      β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚    CLI Bridge       β”‚    β”‚         WASM Computation Layer       β”‚ β”‚
β”‚  β”‚  (I/O Operations)   β”‚    β”‚           (352x faster)              β”‚ β”‚
β”‚  β”‚                     β”‚    β”‚                                      β”‚ β”‚
β”‚  β”‚  β€’ gt commands      β”‚    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚ β”‚
β”‚  β”‚  β€’ bd commands      β”‚    β”‚  β”‚ gastown-     β”‚ β”‚ ruvector-    β”‚  β”‚ β”‚
β”‚  β”‚  β€’ File read/write  β”‚    β”‚  β”‚ formula-wasm β”‚ β”‚ gnn-wasm     β”‚  β”‚ β”‚
β”‚  β”‚  β€’ SQLite queries   β”‚    β”‚  β”‚              β”‚ β”‚              β”‚  β”‚ β”‚
β”‚  β”‚                     β”‚    β”‚  β”‚ β€’ TOML parse β”‚ β”‚ β€’ DAG ops    β”‚  β”‚ β”‚
β”‚  β”‚  [Node.js FFI]      β”‚    β”‚  β”‚ β€’ Variable   β”‚ β”‚ β€’ Topo sort  β”‚  β”‚ β”‚
β”‚  β”‚                     β”‚    β”‚  β”‚   cooking    β”‚ β”‚ β€’ Cycle      β”‚  β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚  β”‚ β€’ Molecule   β”‚ β”‚   detection  β”‚  β”‚ β”‚
β”‚                             β”‚  β”‚   generation β”‚ β”‚ β€’ Critical   β”‚  β”‚ β”‚
β”‚                             β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚   path       β”‚  β”‚ β”‚
β”‚                             β”‚                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚ β”‚
β”‚                             β”‚                                      β”‚ β”‚
β”‚                             β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚ β”‚
β”‚                             β”‚  β”‚ micro-hnsw-  β”‚ β”‚ ruvector-    β”‚  β”‚ β”‚
β”‚                             β”‚  β”‚ wasm         β”‚ β”‚ learning-wasmβ”‚  β”‚ β”‚
β”‚                             β”‚  β”‚              β”‚ β”‚              β”‚  β”‚ β”‚
β”‚                             β”‚  β”‚ β€’ Pattern    β”‚ β”‚ β€’ SONA       β”‚  β”‚ β”‚
β”‚                             β”‚  β”‚   search     β”‚ β”‚   patterns   β”‚  β”‚ β”‚
β”‚                             β”‚  β”‚ β€’ 1000x+     β”‚ β”‚ β€’ MoE routingβ”‚  β”‚ β”‚
β”‚                             β”‚  β”‚   speedup    β”‚ β”‚ β€’ EWC++      β”‚  β”‚ β”‚
β”‚                             β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚ β”‚
β”‚                             β”‚                                      β”‚ β”‚
β”‚                             β”‚  [wasm-bindgen interface]            β”‚ β”‚
β”‚                             β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚                                                                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Contributing

See CONTRIBUTING.md for development setup and guidelines.

License

MIT License - see LICENSE for details.


Built with ❀️ by the Claude Flow Team