A generic Claude Code agent harness: iterative task execution, Slack integration, and persistent memory management.
Project description
TigerHarness
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:
examples/tigers/-- sample team scaffolded bytigerharness inittiger-memory.config.yaml-- annotated memory config (standalone)env.example-- Slack bridge env template (standalone)
Requirements
- Python 3.11+
- For the default
claude_pbackend: the Claude Code CLI (claude) onPATH. - For the
anthropic_sdkbackend: install with[anthropic]extra; pulls inclaude-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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
08db402f4e11dc4cf4681e851c290d36b2a06179a4e1c1f7972eaf79ffeae48d
|
|
| MD5 |
76708b689025a2313682efd0d31688ec
|
|
| BLAKE2b-256 |
717a9f9d86c9c3b236f261e2b3d53be276974f877de9536af23be7309e31ddcf
|
Provenance
The following attestation bundles were made for tigerharness-0.1.4.tar.gz:
Publisher:
release.yml on DingyuZhou/TigerHarness
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tigerharness-0.1.4.tar.gz -
Subject digest:
08db402f4e11dc4cf4681e851c290d36b2a06179a4e1c1f7972eaf79ffeae48d - Sigstore transparency entry: 1564554349
- Sigstore integration time:
-
Permalink:
DingyuZhou/TigerHarness@9ef06ac846c2ad92c27e509cb367bcb7b1cdf855 -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/DingyuZhou
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@9ef06ac846c2ad92c27e509cb367bcb7b1cdf855 -
Trigger Event:
push
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ba30a8ea862b723de7adba661656401d2648abbf95025357fafd11599f779d1e
|
|
| MD5 |
0b50575b37c9a9d78171cc462fa7dfa8
|
|
| BLAKE2b-256 |
8118a2c98e191dadc5cc467a60178bfef5d78ecb7cc82f2e16384cc1230872ea
|
Provenance
The following attestation bundles were made for tigerharness-0.1.4-py3-none-any.whl:
Publisher:
release.yml on DingyuZhou/TigerHarness
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
tigerharness-0.1.4-py3-none-any.whl -
Subject digest:
ba30a8ea862b723de7adba661656401d2648abbf95025357fafd11599f779d1e - Sigstore transparency entry: 1564554598
- Sigstore integration time:
-
Permalink:
DingyuZhou/TigerHarness@9ef06ac846c2ad92c27e509cb367bcb7b1cdf855 -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/DingyuZhou
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@9ef06ac846c2ad92c27e509cb367bcb7b1cdf855 -
Trigger Event:
push
-
Statement type: