Back to Ruflo

ReasoningBank Examples & Code Snippets

v2/docs/reasoningbank/EXAMPLES.md

3.6.3015.2 KB
Original Source

ReasoningBank Examples & Code Snippets

Quick Reference

This document provides ready-to-use examples and code snippets for common ReasoningBank operations.

Table of Contents


CLI Examples

Basic Operations

bash
# Store a simple pattern
npx claude-flow@alpha memory store api_key \
  "JWT tokens with HMAC SHA256 signing" \
  --namespace backend --reasoningbank

# Query with semantic search
npx claude-flow@alpha memory query "authentication" \
  --namespace backend --reasoningbank

# List all patterns in namespace
npx claude-flow@alpha memory list --namespace backend --reasoningbank

# Delete a pattern
npx claude-flow@alpha memory delete api_key \
  --namespace backend --reasoningbank

# Check system status
npx claude-flow@alpha memory status --reasoningbank

Advanced Queries

bash
# Query with confidence threshold
npx claude-flow@alpha memory query "security" \
  --min-confidence 0.7 --reasoningbank

# Query with similarity threshold
npx claude-flow@alpha memory query "performance" \
  --min-similarity 0.8 --reasoningbank

# Cross-namespace search
npx claude-flow@alpha memory query "API design" --reasoningbank

# Query with limit
npx claude-flow@alpha memory query "optimization" \
  --limit 5 --reasoningbank

Cognitive Patterns

bash
# Store with cognitive pattern
npx claude-flow@alpha memory store debug_strategy \
  "Use binary search to isolate bugs" \
  --cognitive-pattern convergent \
  --reasoningbank

# Query by cognitive pattern
npx claude-flow@alpha memory query "problem solving" \
  --cognitive-pattern divergent --reasoningbank

JavaScript/TypeScript Examples

Basic Integration

javascript
import { spawn } from 'child_process';
import path from 'path';

class ReasoningBankClient {
  constructor() {
    this.messageId = 0;
    this.pendingRequests = new Map();
  }

  async initialize() {
    // Spawn agentic-flow process
    const agenticFlowPath = path.join(
      process.cwd(),
      'node_modules/agentic-flow/dist/index.js'
    );

    this.process = spawn('node', [agenticFlowPath]);

    // Handle responses
    this.process.stdout.on('data', data => {
      try {
        const response = JSON.parse(data.toString());
        const handler = this.pendingRequests.get(response.id);

        if (handler) {
          if (response.error) {
            handler.reject(new Error(response.error.message));
          } else {
            handler.resolve(response.result);
          }
          this.pendingRequests.delete(response.id);
        }
      } catch (err) {
        console.error('Failed to parse response:', err);
      }
    });

    this.process.stderr.on('data', data => {
      console.error('agentic-flow error:', data.toString());
    });
  }

  async sendRequest(method, params) {
    const id = ++this.messageId;

    return new Promise((resolve, reject) => {
      const timeout = setTimeout(() => {
        this.pendingRequests.delete(id);
        reject(new Error('Request timeout'));
      }, 30000); // 30 second timeout

      this.pendingRequests.set(id, {
        resolve: result => {
          clearTimeout(timeout);
          resolve(result);
        },
        reject: error => {
          clearTimeout(timeout);
          reject(error);
        }
      });

      const request = JSON.stringify({
        jsonrpc: '2.0',
        method,
        params,
        id
      });

      this.process.stdin.write(request + '\n');
    });
  }

  async storePattern(title, content, options = {}) {
    return this.sendRequest('storePattern', {
      title,
      content,
      namespace: options.namespace || 'default',
      components: options.components || {}
    });
  }

  async query(query, options = {}) {
    return this.sendRequest('searchPatterns', {
      query,
      namespace: options.namespace || 'default',
      limit: options.limit || 10,
      minConfidence: options.minConfidence,
      minSimilarity: options.minSimilarity
    });
  }

  async getPattern(id) {
    return this.sendRequest('getPattern', { id });
  }

  async deletePattern(id) {
    return this.sendRequest('deletePattern', { id });
  }

  async getStatistics(namespace) {
    return this.sendRequest('getStatistics', { namespace });
  }

  shutdown() {
    if (this.process) {
      this.process.kill();
    }
  }
}

// Usage
const client = new ReasoningBankClient();
await client.initialize();

// Store a pattern
await client.storePattern('jwt_auth', 'JWT with refresh tokens', {
  namespace: 'backend',
  components: { reliability: 0.8 }
});

// Query patterns
const results = await client.query('authentication', {
  namespace: 'backend',
  limit: 5
});

console.log('Found patterns:', results);

// Cleanup
client.shutdown();

Self-Learning Agent

javascript
class SelfLearningAgent {
  constructor(namespace) {
    this.namespace = namespace;
    this.client = new ReasoningBankClient();
  }

  async initialize() {
    await this.client.initialize();
  }

  async learn(task, outcome, notes) {
    // Store the task as a pattern
    await this.client.storePattern(
      `task_${Date.now()}`,
      `${task} - ${notes}`,
      {
        namespace: this.namespace,
        components: {
          reliability: outcome === 'success' ? 0.7 : 0.3,
          task_type: this.classifyTask(task),
          outcome,
          timestamp: Date.now()
        }
      }
    );
  }

  async recall(query, options = {}) {
    // Query relevant past experiences
    const results = await this.client.query(query, {
      namespace: this.namespace,
      minConfidence: options.minConfidence || 0.5,
      limit: options.limit || 5
    });

    // Sort by reliability
    return results.sort((a, b) =>
      (b.components?.reliability || 0) - (a.components?.reliability || 0)
    );
  }

  async solve(task) {
    // 1. Recall similar past tasks
    const similarTasks = await this.recall(task, { minConfidence: 0.6 });

    if (similarTasks.length === 0) {
      console.log('No prior experience found. Exploring...');
      return this.exploreNewSolution(task);
    }

    // 2. Apply highest confidence approach
    const bestApproach = similarTasks[0];
    console.log(`Applying approach: ${bestApproach.title}`);
    console.log(`Confidence: ${(bestApproach.components.reliability * 100).toFixed(0)}%`);

    // 3. Execute approach
    const result = await this.executeApproach(bestApproach, task);

    // 4. Learn from outcome
    await this.learn(task, result.success ? 'success' : 'failure', result.notes);

    return result;
  }

  async exploreNewSolution(task) {
    // Implement exploration logic
    return {
      success: false,
      notes: 'Exploration in progress'
    };
  }

  async executeApproach(approach, task) {
    // Implement execution logic
    return {
      success: true,
      notes: `Successfully applied ${approach.title}`
    };
  }

  classifyTask(task) {
    // Simple classification based on keywords
    const keywords = task.toLowerCase();

    if (keywords.includes('auth') || keywords.includes('login')) {
      return 'authentication';
    } else if (keywords.includes('database') || keywords.includes('query')) {
      return 'database';
    } else if (keywords.includes('api')) {
      return 'api';
    } else {
      return 'general';
    }
  }

  shutdown() {
    this.client.shutdown();
  }
}

// Usage
const agent = new SelfLearningAgent('development');
await agent.initialize();

// Agent learns from experience
await agent.solve('Implement user authentication');
await agent.solve('Build REST API endpoints');
await agent.solve('Add JWT token validation');

// Agent gets smarter over time!
const approaches = await agent.recall('authentication');
console.log('Learned approaches:', approaches);

agent.shutdown();

Use Case Examples

1. Team Knowledge Base

bash
# Team members store architectural decisions
npx claude-flow@alpha memory store arch_001 \
  "Microservices with event-driven architecture using Kafka" \
  --namespace team_decisions --reasoningbank

npx claude-flow@alpha memory store arch_002 \
  "Use PostgreSQL for transactional data, Redis for caching" \
  --namespace team_decisions --reasoningbank

npx claude-flow@alpha memory store arch_003 \
  "API Gateway pattern with Kong for rate limiting and auth" \
  --namespace team_decisions --reasoningbank

# New team member queries decisions
npx claude-flow@alpha memory query "message queue" \
  --namespace team_decisions --reasoningbank
# Returns: arch_001 (Kafka decision)

npx claude-flow@alpha memory query "database choice" \
  --namespace team_decisions --reasoningbank
# Returns: arch_002 (PostgreSQL/Redis)

2. Bug Solution Database

bash
# Store bug solutions as you fix them
npx claude-flow@alpha memory store bug_cors_error \
  "CORS error on API calls: Add Access-Control-Allow-Origin header in Express middleware" \
  --namespace debugging --reasoningbank

npx claude-flow@alpha memory store bug_react_rerender \
  "Infinite re-renders in useEffect: Use useRef for values that don't need re-renders" \
  --namespace debugging --reasoningbank

npx claude-flow@alpha memory store bug_memory_leak \
  "Memory leak in React: Clean up subscriptions in useEffect return function" \
  --namespace debugging --reasoningbank

# Later, when you encounter similar bugs
npx claude-flow@alpha memory query "React infinite loop" \
  --namespace debugging --reasoningbank
# Instantly finds the solution!

3. API Best Practices Library

bash
# Build a library of API patterns
npx claude-flow@alpha memory store api_versioning \
  "Use /api/v1/, /api/v2/ URL versioning for backward compatibility" \
  --namespace api_patterns --reasoningbank

npx claude-flow@alpha memory store api_pagination \
  "Cursor-based pagination: /api/items?limit=20&cursor=abc123" \
  --namespace api_patterns --reasoningbank

npx claude-flow@alpha memory store api_error_format \
  'Consistent error format: {"error": true, "message": "...", "code": 400}' \
  --namespace api_patterns --reasoningbank

npx claude-flow@alpha memory store api_rate_limiting \
  "100 requests/minute per IP using sliding window algorithm" \
  --namespace api_patterns --reasoningbank

# Query when designing new API
npx claude-flow@alpha memory query "API response format" \
  --namespace api_patterns --reasoningbank

Integration Patterns

Pattern 1: Pre-Task Retrieval

javascript
// Before starting a task, retrieve relevant patterns
async function executeTask(task) {
  // 1. Query ReasoningBank
  const relevantPatterns = await reasoningBank.query(task.description, {
    namespace: task.domain,
    limit: 3
  });

  // 2. Display patterns to user/agent
  console.log('Relevant past experiences:');
  relevantPatterns.forEach((pattern, i) => {
    console.log(`${i + 1}. ${pattern.title} (${(pattern.score * 100).toFixed(0)}% match)`);
    console.log(`   ${pattern.content}`);
  });

  // 3. Ask user/agent to select or proceed with new approach
  const selected = await promptUser('Use which pattern? (0 for new)');

  if (selected > 0) {
    return applyPattern(relevantPatterns[selected - 1], task);
  } else {
    return exploreNewApproach(task);
  }
}

Pattern 2: Post-Task Learning

javascript
// After completing a task, store the outcome
async function completeTask(task, outcome) {
  // 1. Store pattern with outcome
  await reasoningBank.storePattern(
    `${task.type}_${Date.now()}`,
    task.solution,
    {
      namespace: task.domain,
      components: {
        reliability: outcome.success ? 0.7 : 0.3,
        duration_ms: outcome.duration,
        outcome: outcome.success ? 'success' : 'failure',
        error: outcome.error
      }
    }
  );

  // 2. If similar pattern exists, update its confidence
  if (outcome.basedOnPattern) {
    const existingPattern = await reasoningBank.getPattern(outcome.basedOnPattern);

    if (outcome.success) {
      existingPattern.components.reliability += 0.1;
    } else {
      existingPattern.components.reliability -= 0.15;
    }

    await reasoningBank.updatePattern(existingPattern.id, existingPattern);
  }
}

Pattern 3: Continuous Learning Loop

javascript
// Implement SAFLA (Self-Aware Feedback Loop Algorithm)
class SAFLAAgent {
  async executeSAFLACycle(task) {
    // 1. OBSERVE: Retrieve relevant patterns
    const patterns = await this.reasoningBank.query(task, {
      namespace: this.namespace,
      minConfidence: 0.4
    });

    // 2. ANALYZE: Evaluate pattern relevance and confidence
    const analysis = this.analyzePatterns(patterns);

    // 3. LEARN: Select best approach
    const selectedPattern = analysis.bestPattern;

    // 4. ADAPT: Execute with selected pattern
    const result = await this.execute(selectedPattern, task);

    // 5. FEEDBACK: Update confidence and store outcome
    await this.updateConfidence(selectedPattern.id, result.success);
    await this.storeOutcome(task, result);

    // Return to step 1 for next task
    return result;
  }

  analyzePatterns(patterns) {
    return {
      bestPattern: patterns[0],
      alternatives: patterns.slice(1),
      confidence: patterns[0]?.components.reliability || 0.5
    };
  }

  async updateConfidence(patternId, success) {
    const pattern = await this.reasoningBank.getPattern(patternId);

    if (success) {
      pattern.components.reliability = Math.min(
        1.0,
        pattern.components.reliability + 0.15
      );
    } else {
      pattern.components.reliability = Math.max(
        0.0,
        pattern.components.reliability - 0.1
      );
    }

    await this.reasoningBank.updatePattern(patternId, pattern);
  }
}

Shell Scripts

Bulk Import

bash
#!/bin/bash
# bulk-import.sh - Import patterns from CSV file

# CSV format: title,content,namespace
while IFS=',' read -r title content namespace; do
  npx claude-flow@alpha memory store "$title" "$content" \
    --namespace "$namespace" --reasoningbank
done < patterns.csv

echo "Import complete!"

Backup & Restore

bash
#!/bin/bash
# backup-memory.sh - Backup ReasoningBank database

BACKUP_DIR="backups/$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR"

# Copy database
cp .swarm/memory.db "$BACKUP_DIR/"

# Export as JSON (if feature available)
npx claude-flow@alpha memory export --all > "$BACKUP_DIR/patterns.json"

echo "Backup saved to $BACKUP_DIR"

Generate Report

bash
#!/bin/bash
# report.sh - Generate usage report

echo "ReasoningBank Usage Report"
echo "=========================="
echo ""

npx claude-flow@alpha memory status --detailed --reasoningbank | \
  grep -E "(Total Patterns|Most Used|Average Confidence)"

echo ""
echo "Namespaces:"
npx claude-flow@alpha memory list --reasoningbank | \
  grep -E "^├──|^└──"

Summary

This document provided:

  • ✅ CLI command examples
  • ✅ JavaScript/TypeScript integration code
  • ✅ Real-world use cases
  • ✅ Integration patterns (pre-task, post-task, SAFLA)
  • ✅ Shell scripts for automation

For more examples, see:


Last Updated: 2025-10-14 Version: v2.7.0-alpha.10