smarttools/docs/EXAMPLES.md

19 KiB

Example Tools

This document contains all 28 pre-built SmartTools with their full configurations.

Quick Install

# Install all example tools
curl -sSL https://gitea.brrd.tech/rob/smarttools/raw/branch/main/examples/install.py | python3
smarttools refresh

Text Processing Tools

summarize

Condense long documents to key points.

# ~/.smarttools/summarize/config.yaml
name: summarize
description: Condense long documents to key points
arguments:
  - flag: --length
    variable: length
    default: "3-5 bullet points"
steps:
  - type: prompt
    prompt: |
      Summarize the following text into {length}. Be concise and capture the key points:

      {input}      
    provider: opencode-pickle
    output_var: response
output: "{response}"

Usage:

cat article.txt | summarize
cat book.txt | summarize --length "10 bullet points"

translate

Translate text to any language.

name: translate
description: Translate text to any language
arguments:
  - flag: --lang
    variable: lang
    default: Spanish
steps:
  - type: prompt
    prompt: |
      Translate the following text to {lang}. Only output the translation, nothing else:

      {input}      
    provider: claude-haiku
    output_var: response
output: "{response}"

Usage:

echo "Hello, world!" | translate --lang French
cat readme.md | translate --lang Japanese

fix-grammar

Fix grammar and spelling errors.

name: fix-grammar
description: Fix grammar and spelling errors
arguments: []
steps:
  - type: prompt
    prompt: |
      Fix all grammar, spelling, and punctuation errors in the following text. Only output the corrected text, no explanations:

      {input}      
    provider: opencode-deepseek
    output_var: response
output: "{response}"

Usage:

echo "teh cat sat on teh mat" | fix-grammar
cat draft.txt | fix-grammar > fixed.txt

simplify

Rewrite text for easier understanding.

name: simplify
description: Rewrite text for easier understanding
arguments:
  - flag: --level
    variable: level
    default: "5th grade reading level"
steps:
  - type: prompt
    prompt: |
      Rewrite the following text for a {level}. Keep the meaning but use simpler words and shorter sentences:

      {input}      
    provider: opencode-pickle
    output_var: response
output: "{response}"

Usage:

cat legal_document.txt | simplify
cat technical.md | simplify --level "non-technical reader"

tone-shift

Change the tone of text.

name: tone-shift
description: Change the tone of text
arguments:
  - flag: --tone
    variable: tone
    default: professional
steps:
  - type: prompt
    prompt: |
      Rewrite the following text in a {tone} tone. Keep the core message but adjust the style:

      {input}      
    provider: opencode-deepseek
    output_var: response
output: "{response}"

Usage:

cat angry_email.txt | tone-shift --tone "calm and professional"
cat casual_note.txt | tone-shift --tone formal

eli5

Explain like I'm 5.

name: eli5
description: Explain like I'm 5
arguments: []
steps:
  - type: prompt
    prompt: |
      Explain this like I'm 5 years old. Use simple words and fun analogies:

      {input}      
    provider: opencode-pickle
    output_var: response
output: "{response}"

Usage:

echo "What is quantum computing?" | eli5
cat whitepaper.txt | eli5

tldr

One-line summary.

name: tldr
description: One-line summary
arguments: []
steps:
  - type: prompt
    prompt: |
      Give a one-line TL;DR summary of this text:

      {input}      
    provider: opencode-grok
    output_var: response
output: "{response}"

Usage:

cat long_article.txt | tldr
curl -s https://example.com | tldr

expand

Expand bullet points to paragraphs.

name: expand
description: Expand bullet points to paragraphs
arguments: []
steps:
  - type: prompt
    prompt: |
      Expand these bullet points into well-written paragraphs:

      {input}      
    provider: opencode-pickle
    output_var: response
output: "{response}"

Usage:

cat notes.txt | expand
echo "- Fast\n- Reliable\n- Easy to use" | expand

Developer Tools

explain-error

Explain error messages and stack traces.

name: explain-error
description: Explain error messages and stack traces
arguments: []
steps:
  - type: prompt
    prompt: |
      Explain this error/stack trace in plain English. What went wrong and how to fix it:

      {input}      
    provider: claude-haiku
    output_var: response
output: "{response}"

Usage:

cat error.log | explain-error
python script.py 2>&1 | explain-error

explain-code

Explain what code does.

name: explain-code
description: Explain what code does
arguments:
  - flag: --detail
    variable: detail
    default: moderate
steps:
  - type: prompt
    prompt: |
      Explain what this code does at a {detail} level of detail:

      ```
      {input}
      ```      
    provider: opencode-pickle
    output_var: response
output: "{response}"

Usage:

cat script.py | explain-code
cat complex.js | explain-code --detail "very detailed"

review-code

Quick code review with suggestions.

name: review-code
description: Quick code review with suggestions
arguments:
  - flag: --focus
    variable: focus
    default: "bugs, security, and improvements"
steps:
  - type: prompt
    prompt: |
      Review this code focusing on {focus}. Be concise and actionable:

      ```
      {input}
      ```      
    provider: claude-sonnet
    output_var: response
output: "{response}"

Usage:

cat pull_request.diff | review-code
cat auth.py | review-code --focus "security vulnerabilities"

gen-tests

Generate unit tests for code.

name: gen-tests
description: Generate unit tests for code
arguments:
  - flag: --framework
    variable: framework
    default: pytest
steps:
  - type: prompt
    prompt: |
      Generate comprehensive unit tests for this code using {framework}. Include edge cases:

      ```
      {input}
      ```      
    provider: claude-haiku
    output_var: response
output: "{response}"

Usage:

cat utils.py | gen-tests
cat api.js | gen-tests --framework jest

docstring

Add docstrings to functions/classes.

name: docstring
description: Add docstrings to functions/classes
arguments:
  - flag: --style
    variable: style
    default: Google style
steps:
  - type: prompt
    prompt: |
      Add {style} docstrings to all functions and classes in this code. Output the complete code with docstrings:

      ```
      {input}
      ```      
    provider: opencode-deepseek
    output_var: response
output: "{response}"

Usage:

cat module.py | docstring
cat functions.py | docstring --style "NumPy style"

commit-msg

Generate commit message from diff.

name: commit-msg
description: Generate commit message from diff
arguments:
  - flag: --style
    variable: style
    default: conventional commits
steps:
  - type: prompt
    prompt: |
      Generate a concise {style} commit message for this diff. Just the message, no explanation:

      {input}      
    provider: opencode-pickle
    output_var: response
output: "{response}"

Usage:

git diff --staged | commit-msg
git diff HEAD~1 | commit-msg --style "simple"

Data Tools

json-extract

Extract structured data as validated JSON.

name: json-extract
description: Extract structured data as validated JSON
arguments:
  - flag: --fields
    variable: fields
    default: any relevant fields
steps:
  - type: prompt
    prompt: |
      Extract {fields} from this text as a JSON object. Output ONLY valid JSON, no markdown, no explanation:

      {input}      
    provider: opencode-deepseek
    output_var: raw_json
  - type: code
    code: |
      import json
      import re
      text = raw_json.strip()
      text = re.sub(r'^```json?\s*', '', text)
      text = re.sub(r'\s*```$', '', text)
      try:
          parsed = json.loads(text)
          validated = json.dumps(parsed, indent=2)
      except json.JSONDecodeError as e:
          validated = f"ERROR: Invalid JSON - {e}\nRaw output: {text[:500]}"      
    output_var: validated
output: "{validated}"

Usage:

echo "Price $49.99, SKU ABC-123" | json-extract --fields "price, sku"
cat invoice.txt | json-extract --fields "total, date, items"

json2csv

Convert JSON to CSV format.

name: json2csv
description: Convert JSON to CSV format
arguments: []
steps:
  - type: prompt
    prompt: |
      Convert this JSON to CSV format. Output only the CSV, no explanation:

      {input}      
    provider: opencode-deepseek
    output_var: response
output: "{response}"

Usage:

cat data.json | json2csv
echo '[{"name":"John","age":30}]' | json2csv

extract-emails

Extract email addresses from text.

name: extract-emails
description: Extract email addresses from text
arguments: []
steps:
  - type: prompt
    prompt: |
      Extract all email addresses from this text. Output one email per line, nothing else:

      {input}      
    provider: opencode-pickle
    output_var: response
output: "{response}"

Usage:

cat webpage.html | extract-emails
cat contacts.txt | extract-emails | sort -u

extract-contacts

Extract contact info as structured CSV.

name: extract-contacts
description: Extract contact info as structured CSV
arguments: []
steps:
  - type: prompt
    prompt: |
      Extract all contact information (name, email, phone, company) from this text. Output as JSON array with objects having keys: name, email, phone, company. Use null for missing fields. Output ONLY the JSON array:

      {input}      
    provider: opencode-pickle
    output_var: contacts_json
  - type: code
    code: |
      import json
      import re
      text = contacts_json.strip()
      text = re.sub(r'^```json?\s*', '', text)
      text = re.sub(r'\s*```$', '', text)
      try:
          contacts = json.loads(text)
          lines = ['name,email,phone,company']
          for c in contacts:
              row = [
                  str(c.get('name') or ''),
                  str(c.get('email') or ''),
                  str(c.get('phone') or ''),
                  str(c.get('company') or '')
              ]
              lines.append(','.join(f'"{f}"' for f in row))
          csv_output = '\n'.join(lines)
      except:
          csv_output = f"Error parsing contacts: {text[:200]}"      
    output_var: csv_output
output: "{csv_output}"

Usage:

cat business_cards.txt | extract-contacts
cat meeting_notes.txt | extract-contacts > contacts.csv

sql-from-text

Generate SQL from natural language.

name: sql-from-text
description: Generate SQL from natural language
arguments:
  - flag: --dialect
    variable: dialect
    default: PostgreSQL
steps:
  - type: prompt
    prompt: |
      Generate a {dialect} SQL query for this request. Output only the SQL, no explanation:

      {input}      
    provider: claude-haiku
    output_var: response
output: "{response}"

Usage:

echo "get all users who signed up last month" | sql-from-text
echo "count orders by status" | sql-from-text --dialect MySQL

safe-sql

Generate SQL with safety checks.

name: safe-sql
description: Generate SQL with safety checks
arguments:
  - flag: --dialect
    variable: dialect
    default: PostgreSQL
steps:
  - type: prompt
    prompt: |
      Generate a {dialect} SELECT query for: {input}

      Output ONLY the SQL query, no explanation.      
    provider: claude-haiku
    output_var: raw_sql
  - type: code
    code: |
      import re
      sql = raw_sql.strip()
      sql = re.sub(r'^```sql?\s*', '', sql)
      sql = re.sub(r'\s*```$', '', sql)
      dangerous = ['DROP', 'DELETE', 'TRUNCATE', 'UPDATE', 'INSERT', 'ALTER', 'CREATE', 'GRANT']
      warnings = []
      for keyword in dangerous:
          if re.search(r'\b' + keyword + r'\b', sql, re.I):
              warnings.append(f"WARNING: Contains {keyword}")
      if warnings:
          validated = '\n'.join(warnings) + '\n\n' + sql
      else:
          validated = sql      
    output_var: validated
output: "{validated}"

Usage:

echo "get active users" | safe-sql
echo "remove inactive accounts" | safe-sql  # Will show WARNING

parse-log

Summarize and analyze log files.

name: parse-log
description: Summarize and analyze log files
arguments:
  - flag: --focus
    variable: focus
    default: errors and warnings
steps:
  - type: prompt
    prompt: |
      Analyze these logs focusing on {focus}. Summarize key issues and patterns:

      {input}      
    provider: claude-haiku
    output_var: response
output: "{response}"

Usage:

cat app.log | parse-log
tail -1000 /var/log/syslog | parse-log --focus "security events"

csv-insights

Analyze CSV with sampled data for large files.

name: csv-insights
description: Analyze CSV with sampled data for large files
arguments:
  - flag: --question
    variable: question
    default: What patterns and insights can you find?
steps:
  - type: code
    code: |
      import random
      lines = input.strip().split('\n')
      header = lines[0] if lines else ''
      data_lines = lines[1:] if len(lines) > 1 else []

      if len(data_lines) > 50:
          sampled = random.sample(data_lines, 50)
          sample_note = f"(Sampled 50 of {len(data_lines)} rows)"
      else:
          sampled = data_lines
          sample_note = f"({len(data_lines)} rows)"

      sampled_csv = header + '\n' + '\n'.join(sampled)
      stats = f"Columns: {len(header.split(','))}, Rows: {len(data_lines)} {sample_note}"      
    output_var: sampled_csv,stats
  - type: prompt
    prompt: |
      Analyze this CSV data. {stats}

      Question: {question}

      Data:
      {sampled_csv}      
    provider: claude-haiku
    output_var: response
output: "{response}"

Usage:

cat sales.csv | csv-insights
cat large_data.csv | csv-insights --question "What are the top trends?"

Advanced Multi-Step Tools

log-errors

Extract and explain errors from large log files.

name: log-errors
description: Extract and explain errors from large log files
arguments: []
steps:
  - type: code
    code: |
      import re
      lines = input.split('\n')
      errors = [l for l in lines if re.search(r'\b(ERROR|CRITICAL|FATAL|Exception|Traceback)\b', l, re.I)]
      result = []
      for i, line in enumerate(lines):
          if re.search(r'\b(ERROR|CRITICAL|FATAL|Exception|Traceback)\b', line, re.I):
              result.extend(lines[i:i+5])
      extracted = '\n'.join(result[:200])      
    output_var: extracted
  - type: prompt
    prompt: |
      Analyze these error log entries. Group by error type, explain likely causes, and suggest fixes:

      {extracted}      
    provider: claude-haiku
    output_var: response
output: "{response}"

Usage:

cat huge_app.log | log-errors
zcat archived.log.gz | log-errors

diff-focus

Review only the added/changed code in a diff.

name: diff-focus
description: Review only the added/changed code in a diff
arguments: []
steps:
  - type: code
    code: |
      lines = input.split('\n')
      result = []
      for i, line in enumerate(lines):
          if line.startswith('@@') or line.startswith('+++') or line.startswith('---'):
              result.append(line)
          elif line.startswith('+') and not line.startswith('+++'):
              result.append(line)
      extracted = '\n'.join(result)      
    output_var: extracted
  - type: prompt
    prompt: |
      Review these added lines of code. Focus on bugs, security issues, and improvements:

      {extracted}      
    provider: claude-haiku
    output_var: response
output: "{response}"

Usage:

git diff | diff-focus
git diff HEAD~5 | diff-focus

changelog

Generate changelog from git commits.

name: changelog
description: Generate changelog from git commits
arguments:
  - flag: --since
    variable: since
    default: last week
steps:
  - type: code
    code: |
      lines = input.strip().split('\n')
      commits = []
      for line in lines:
          if line.strip() and not line.startswith('commit '):
              commits.append(line.strip())
      git_log = '\n'.join(commits[:100])      
    output_var: git_log
  - type: prompt
    prompt: |
      Generate a user-friendly changelog from these git commits. Group by category (Features, Fixes, Improvements, etc). Use markdown with bullet points:

      {git_log}      
    provider: opencode-pickle
    output_var: changelog_raw
  - type: code
    code: |
      from datetime import datetime
      header = f"""# Changelog      

Generated: {datetime.now().strftime('%Y-%m-%d')}

"""
      formatted = header + changelog_raw
    output_var: formatted
output: "{formatted}"

Usage:

git log --oneline -50 | changelog
git log --since="2024-01-01" --oneline | changelog

code-validate

Generate and validate Python code.

name: code-validate
description: Generate and validate Python code
arguments:
  - flag: --task
    variable: task
    default: ""
steps:
  - type: prompt
    prompt: |
      Write Python code to: {task}

      Context/input data:
      {input}

      Output ONLY the Python code, no markdown, no explanation.      
    provider: claude-haiku
    output_var: raw_code
  - type: code
    code: |
      import ast
      import re
      code = raw_code.strip()
      code = re.sub(r'^```python?\s*', '', code)
      code = re.sub(r'\s*```$', '', code)
      try:
          ast.parse(code)
          validated = code
      except SyntaxError as e:
          validated = f"# SYNTAX ERROR at line {e.lineno}: {e.msg}\n# Fix needed:\n\n{code}"      
    output_var: validated
output: "{validated}"

Usage:

echo "list of numbers: 1,2,3,4,5" | code-validate --task "calculate the sum"
cat data.json | code-validate --task "parse and find the maximum value"

Writing Your Own Tools

Basic Structure

name: my-tool
description: What this tool does
arguments:
  - flag: --option
    variable: option_name
    default: "default value"
steps:
  - type: prompt
    prompt: |
      Your prompt here with {input} and {option_name}      
    provider: opencode-pickle
    output_var: response
output: "{response}"

Multi-Step Structure

name: my-pipeline
description: Multi-step tool
steps:
  # Step 1: Preprocess with code
  - type: code
    code: |
      # Python code here
      processed = input.upper()      
    output_var: processed

  # Step 2: AI processing
  - type: prompt
    prompt: "Analyze: {processed}"
    provider: claude-haiku
    output_var: analysis

  # Step 3: Post-process with code
  - type: code
    code: |
      result = f"RESULT:\n{analysis}"      
    output_var: result
output: "{result}"

Tips

  1. Use cheap providers for simple tasks (opencode-pickle)
  2. Use code steps to validate AI output
  3. Preprocess large inputs to reduce tokens
  4. Test with mock before using real AI: --provider mock