Skip to main content

A generic Claude Code agent harness: iterative task execution, Slack integration, and persistent memory management.

Project description

TigerHarness

PyPI Python License

A generic Claude Code agent harness: iterative task execution, Slack integration, and persistent memory management.

Sub-packages

Package Description
tigerharness.agent_sdk Backend-agnostic agent SDK. Same caller code, swappable runtimes: claude -p subprocess, Anthropic's claude-agent-sdk, OpenAI's openai-agents (planned).
tigerharness.task_runner Fire-and-forget iterative task execution. Drives a persona through N Claude turns with periodic /compact.
tigerharness.slack_bridge Slack Socket Mode bridge. Forwards DMs to a claude -p backend and posts replies back to the thread.
tigerharness.tiger_memory Persistent agent memory: archive, journal, briefing with lazy rebuild, kind-decay must-memorize, and drill-down.

Installation

# Core (claude -p backend only; Claude Code CLI must be on PATH)
pip install tigerharness

# With the official claude-agent-sdk backend
pip install tigerharness[anthropic]

# With Slack bridge support
pip install tigerharness[slack]

# With memory support
pip install tigerharness[memory]

# With memory + RAG (local embeddings, free)
pip install tigerharness[memory-rag]

# Everything
pip install tigerharness[all]

Or with uv:

uv add tigerharness
uv add tigerharness --extra all

Quick start

Scaffold a team and its first persona

tigerharness init is interactive — it walks you through picking (or creating) a team and adding a persona inside it. Every persona always belongs to a team, and a team is a self-contained directory:

tigers/
├── configs/
│   ├── personas.yaml              # team registry (auto-updated)
│   └── .env                       # Slack tokens (gitignored)
├── skills/
│   └── README.md                  # drop team-shared skills here
├── personas/
│   ├── chief/
│   │   └── prompt.md              # the persona's system prompt
│   └── scout/
│       └── prompt.md
└── memories/
    ├── chief/
    │   └── tiger-memory.config.yaml   # per-persona memory config
    └── scout/
        └── tiger-memory.config.yaml
# Fully interactive — prompts for persona name, team, slack/memory opts
tigerharness init

# Non-interactive — creates team 'tigers' with persona 'chief'
tigerharness init --persona chief --team tigers --yes

# Add a second persona to the same team
tigerharness init --persona scout --team tigers --yes

# Skip Slack or memory generation
tigerharness init --persona chief --team tigers --no-memory --no-slack --yes

Task runner

# 1. Point tigerharness at your team's persona registry
export TIGERHARNESS_PERSONAS_CONFIG=./tigers/configs/personas.yaml

# 2. Assign a task (5 iterations)
python -m tigerharness.task_runner assign \
    --to chief \
    --prompt "Research the latest developments in solar energy" \
    --iters 5

# 3. Check status
python -m tigerharness.task_runner list

# 4. View logs
python -m tigerharness.task_runner logs <task-id>

Slack bridge

# 1. Fill in your Slack tokens in tigers/configs/.env (from api.slack.com)
#    SLACK_APP_TOKEN=xapp-...
#    SLACK_BOT_TOKEN=xoxb-...
#    ALLOWED_SLACK_USER_IDS=U0123ABC

# 2. Run the bridge
python -m tigerharness.slack_bridge

Tiger memory

Each persona has its own memory config under tigers/memories/<persona>/tiger-memory.config.yaml. Edit it to point at your Claude Code project path, then:

--config is a top-level option for the tiger-memory sub-command, so it must appear before the verb:

# Save typing — the same path is reused everywhere
CFG=tigers/memories/chief/tiger-memory.config.yaml

# 1. Initialize the memory store (per persona)
tigerharness tiger-memory --config $CFG init

# 2. Bootstrap (one-time backfill from existing transcripts)
tigerharness tiger-memory --config $CFG bootstrap --dry-run
tigerharness tiger-memory --config $CFG bootstrap

# 3. Rebuild (incremental, run after each session)
tigerharness tiger-memory --config $CFG rebuild

# 4. Search memory
tigerharness tiger-memory --config $CFG search "solar energy"

# 5. Pin a must-memorize fact
tigerharness tiger-memory --config $CFG pin "Prefers solar over wind"

Configuration

All paths are resolved from environment variables -- no hardcoded paths.

Variable Default Description
TIGERHARNESS_STATE_DIR ~/.local/state/tigerharness-tasks/ Task runner state directory
TIGERHARNESS_PERSONAS_DIR (none) Directory containing <name>.md prompt files
TIGERHARNESS_SLACK_ENV .env Path to slack-bridge .env file
TIGERHARNESS_AGENT_CWD . Working directory for the Claude agent
TIGERHARNESS_AGENT_PROMPT (none) Path to the agent's system prompt
TIGERHARNESS_SLACK_BRIDGE_DIR (none) Path to slack-bridge service dir (for notify CLI)
TIGERHARNESS_ATTACHMENT_DIR /tmp/slack-attachments Where to stage downloaded files
TIGER_MEMORY_CONFIG (none) Path to tiger-memory YAML config
TIGER_MEMORY_CLI (none) Path to tiger-memory CLI binary

Examples

See examples/ for a fully-populated sample team folder (examples/tigers/) and standalone reference configs:

Requirements

  • Python 3.11+
  • For the default claude_p backend: the Claude Code CLI (claude) on PATH.
  • For the anthropic_sdk backend: install with [anthropic] extra; pulls in claude-agent-sdk.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tigerharness-0.1.4.tar.gz (269.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tigerharness-0.1.4-py3-none-any.whl (170.0 kB view details)

Uploaded Python 3

File details

Details for the file tigerharness-0.1.4.tar.gz.

File metadata

  • Download URL: tigerharness-0.1.4.tar.gz
  • Upload date:
  • Size: 269.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for tigerharness-0.1.4.tar.gz
Algorithm Hash digest
SHA256 08db402f4e11dc4cf4681e851c290d36b2a06179a4e1c1f7972eaf79ffeae48d
MD5 76708b689025a2313682efd0d31688ec
BLAKE2b-256 717a9f9d86c9c3b236f261e2b3d53be276974f877de9536af23be7309e31ddcf

See more details on using hashes here.

Provenance

The following attestation bundles were made for tigerharness-0.1.4.tar.gz:

Publisher: release.yml on DingyuZhou/TigerHarness

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tigerharness-0.1.4-py3-none-any.whl.

File metadata

  • Download URL: tigerharness-0.1.4-py3-none-any.whl
  • Upload date:
  • Size: 170.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for tigerharness-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 ba30a8ea862b723de7adba661656401d2648abbf95025357fafd11599f779d1e
MD5 0b50575b37c9a9d78171cc462fa7dfa8
BLAKE2b-256 8118a2c98e191dadc5cc467a60178bfef5d78ecb7cc82f2e16384cc1230872ea

See more details on using hashes here.

Provenance

The following attestation bundles were made for tigerharness-0.1.4-py3-none-any.whl:

Publisher: release.yml on DingyuZhou/TigerHarness

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page