OpenHarness End-to-End Evals
HKUDS/OpenHarness
Validates OpenHarness features by running real multi-turn agent loops with live LLM calls against an unfamiliar codebase, checking actual tool execution.
Deploy and test dspy-cli on Fly.io using local changes via temp git branch.
$ npx skills add cmpnd-ai/dspy-cli --skill fly-e2e-test -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install cmpnd-ai/dspy-cli fly-e2e-test --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/cmpnd-ai/dspy-cli.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/fly-e2e-test .claude/skills/fly-e2e-test && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "fly-e2e-test" agent skill from https://github.com/cmpnd-ai/dspy-cli/tree/main/.claude/skills/fly-e2e-test into .claude/skills/fly-e2e-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fly-e2e-test", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/cmpnd-ai/dspy-cli/tree/main/.claude/skills/fly-e2e-testType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add cmpnd-ai/dspy-cli --skill fly-e2e-test -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install cmpnd-ai/dspy-cli fly-e2e-test --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cmpnd-ai/dspy-cli.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/fly-e2e-test .agents/skills/fly-e2e-test && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "fly-e2e-test" agent skill from https://github.com/cmpnd-ai/dspy-cli/tree/main/.claude/skills/fly-e2e-test into .agents/skills/fly-e2e-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fly-e2e-test", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add cmpnd-ai/dspy-cli --skill fly-e2e-test -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install cmpnd-ai/dspy-cli fly-e2e-test --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cmpnd-ai/dspy-cli.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/fly-e2e-test .cursor/skills/fly-e2e-test && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "fly-e2e-test" agent skill from https://github.com/cmpnd-ai/dspy-cli/tree/main/.claude/skills/fly-e2e-test into .cursor/skills/fly-e2e-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fly-e2e-test", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/cmpnd-ai/dspy-cli.git --path .claude/skills/fly-e2e-test--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add cmpnd-ai/dspy-cli --skill fly-e2e-test -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install cmpnd-ai/dspy-cli fly-e2e-test --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cmpnd-ai/dspy-cli.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/fly-e2e-test .gemini/skills/fly-e2e-test && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "fly-e2e-test" agent skill from https://github.com/cmpnd-ai/dspy-cli/tree/main/.claude/skills/fly-e2e-test into .gemini/skills/fly-e2e-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fly-e2e-test", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install cmpnd-ai/dspy-cli fly-e2e-testInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add cmpnd-ai/dspy-cli --skill fly-e2e-test -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/cmpnd-ai/dspy-cli.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/fly-e2e-test .github/skills/fly-e2e-test && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "fly-e2e-test" agent skill from https://github.com/cmpnd-ai/dspy-cli/tree/main/.claude/skills/fly-e2e-test into .github/skills/fly-e2e-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fly-e2e-test", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add cmpnd-ai/dspy-cli --skill fly-e2e-test -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install cmpnd-ai/dspy-cli fly-e2e-test --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cmpnd-ai/dspy-cli.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/fly-e2e-test .opencode/skills/fly-e2e-test && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "fly-e2e-test" agent skill from https://github.com/cmpnd-ai/dspy-cli/tree/main/.claude/skills/fly-e2e-test into .opencode/skills/fly-e2e-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fly-e2e-test", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
fly-e2e-testDeploy and test dspy-cli on Fly.io using local changes via temp git branch.
Fly E2E Test is an agent skill from cmpnd-ai/dspy-cli. Deploy and test dspy-cli on Fly.io using local changes via temp git branch. Full integration testing with guaranteed cleanup. (project)
Its SKILL.md is about 2.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Testing & QA, covering Integration testing, End-to-end testing and Git workflow. It works with Git. The repository describes itself as: dspy-cli is a tool for creating, developing, testing, and deploying DSPy programs as HTTP APIs. The licence is MIT.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit c3b667e. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
BashFrom allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
flycurlgitapt-getFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use curl and git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
OPENAI_API_KEYDSPY_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Fly E2E Test loads about 2.3k tokens when it runs. Until then it costs about 37 tokens; SKILL.md has 369 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
. **OPENAI_API_KEY**: In environment or `.env` file# Source .env for OPENAI_API_KEYx send-keys -t e2e-fly 'set -a && source .env && set +a' C-mallowed-tools: BashAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from cmpnd-ai/dspy-cli at commit c3b667e, republished under its MIT licence (© cmpnd-ai). 369 words, ~2,304 tokens.
.claude/skills/fly-e2e-test/SKILL.md (or your agent's skills folder).Deploy a fresh dspy-cli project to Fly.io using your local code changes, run full integration tests (health, auth, LLM execution), and guarantee cleanup regardless of success or failure.
e2e-test/{timestamp}-{random} for easy identificationfly auth whoami).env fileRun each phase in a tmux session to enable output capture and cleanup tracking.
# Create tmux session
tmux new-session -d -s e2e-fly -c /Users/isaac/projects/dspy-cli
# Set variables
tmux send-keys -t e2e-fly 'export DSPY_CLI_DIR="/Users/isaac/projects/dspy-cli"' C-m
tmux send-keys -t e2e-fly 'export TIMESTAMP=$(date +%s)' C-m
tmux send-keys -t e2e-fly 'export RANDOM_SUFFIX=$(head -c 4 /dev/urandom | xxd -p)' C-m
tmux send-keys -t e2e-fly 'export FLY_APP_NAME="dspy-e2e-${RANDOM_SUFFIX}"' C-m
tmux send-keys -t e2e-fly 'export TEMP_BRANCH="e2e-test/${TIMESTAMP}-${RANDOM_SUFFIX}"' C-m
# Source .env for OPENAI_API_KEY
tmux send-keys -t e2e-fly 'set -a && source .env && set +a' C-m
# Verify setup
tmux send-keys -t e2e-fly 'echo "App: $FLY_APP_NAME Branch: $TEMP_BRANCH"' C-m# Verify fly CLI
tmux send-keys -t e2e-fly 'fly version && fly auth whoami' C-m
# Check for uncommitted changes (stash if needed)
tmux send-keys -t e2e-fly 'git status --porcelain' C-m
# Clean up any orphaned e2e resources
tmux send-keys -t e2e-fly 'fly apps list 2>/dev/null | grep "dspy-e2e" || echo "No orphaned apps"' C-mtmux send-keys -t e2e-fly 'git checkout -b "$TEMP_BRANCH"' C-m
tmux send-keys -t e2e-fly 'git push -u origin "$TEMP_BRANCH"' C-m# Create temp directory
tmux send-keys -t e2e-fly 'export TEST_DIR=$(mktemp -d) && echo "TEST_DIR=$TEST_DIR"' C-m
# Create project (will prompt for API key confirmation - send Y)
tmux send-keys -t e2e-fly 'uv run --directory "$DSPY_CLI_DIR" dspy-cli new fly-e2e-test --program-name qa_module --signature "question:str -> answer:str" --module-type Predict --model openai/gpt-4o-mini' C-m
# When prompted "Proceed with this API key? [Y/n]:", send:
tmux send-keys -t e2e-fly 'Y' C-m
# Move project to temp dir (dspy-cli creates in current dir)
tmux send-keys -t e2e-fly 'mv "$DSPY_CLI_DIR/fly-e2e-test" "$TEST_DIR/" && cd "$TEST_DIR/fly-e2e-test"' C-m# Update pyproject.toml to install dspy-cli from temp branch
tmux send-keys -t e2e-fly 'sed -i.bak "s|\"dspy-cli\"|\"dspy-cli @ git+https://github.com/cmpnd-ai/dspy-cli.git@$TEMP_BRANCH\"|" pyproject.toml' C-m
# IMPORTANT: Update Dockerfile to include git (required for git-based deps)
# NOTE: This is an example dockerfile. There may be specific changes in a newer version of dspy-cli. Check the current Dockerfile and add the Git install line
tmux send-keys -t e2e-fly 'cat > Dockerfile << '"'"'EOF'"'"'
FROM python:3.11-slim
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV XDG_CACHE_HOME=/tmp/.cache
# Install git for fetching dspy-cli from git URL
RUN apt-get update && apt-get install -y git && rm -rf /var/lib/apt/lists/*
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
COPY . .
RUN uv sync --no-dev
EXPOSE 8000
CMD ["uv", "run", "dspy-cli", "serve", "--host", "0.0.0.0", "--port", "8000", "--auth", "--no-reload"]
EOF' C-m# Create fly.toml
tmux send-keys -t e2e-fly 'cat > fly.toml << EOF
app = '"'"'$FLY_APP_NAME'"'"'
primary_region = '"'"'ewr'"'"'
[build]
[http_service]
internal_port = 8000
force_https = true
auto_stop_machines = true
auto_start_machines = true
min_machines_running = 0
processes = ['"'"'app'"'"']
[[vm]]
memory = '"'"'512mb'"'"'
cpu_kind = '"'"'shared'"'"'
cpus = 1
EOF' C-m
# Create app
tmux send-keys -t e2e-fly 'fly apps create "$FLY_APP_NAME" --org personal' C-m
# Generate a random API key for testing
tmux send-keys -t e2e-fly 'export DSPY_API_KEY_VALUE="test-e2e-$(head -c 8 /dev/urandom | xxd -p)"' C-m
# Set secrets using fly secrets (required env vars for your app)
# Add any additional env vars your project needs here
tmux send-keys -t e2e-fly 'fly secrets set OPENAI_API_KEY="$OPENAI_API_KEY" DSPY_API_KEY="$DSPY_API_KEY_VALUE" --app "$FLY_APP_NAME"' C-m
# Deploy (takes ~2-3 minutes)
tmux send-keys -t e2e-fly 'fly deploy --app "$FLY_APP_NAME" --wait-timeout 300' C-mtmux send-keys -t e2e-fly 'export FLY_APP_URL="https://$FLY_APP_NAME.fly.dev"' C-m
# Test 1: Health Check
tmux send-keys -t e2e-fly 'echo "=== Test 1: Health Check ===" && curl -s "$FLY_APP_URL/health"' C-m
# Expected: {"status":"ok"}
# Test 2: Auth Redirect (unauthenticated)
tmux send-keys -t e2e-fly 'echo "=== Test 2: Auth Redirect ===" && curl -s -o /dev/null -w "HTTP: %{http_code}\n" "$FLY_APP_URL/programs"' C-m
# Expected: HTTP: 303
# Test 3: Auth Success (authenticated)
tmux send-keys -t e2e-fly 'echo "=== Test 3: Auth Success ===" && curl -s -H "Authorization: Bearer $DSPY_API_KEY_VALUE" "$FLY_APP_URL/programs"' C-m
# Expected: {"programs":[{"name":"QaModulePredict",...}]}
# Test 4: LLM Module Execution
tmux send-keys -t e2e-fly 'echo "=== Test 4: LLM Execution ===" && curl -s -X POST -H "Authorization: Bearer $DSPY_API_KEY_VALUE" -H "Content-Type: application/json" -d '"'"'{"question": "What is 2+2?"}'"'"' "$FLY_APP_URL/QaModulePredict"' C-m
# Expected: {"answer":"4"} (or similar)ALWAYS run cleanup, even if tests fail:
# Destroy Fly app
tmux send-keys -t e2e-fly 'fly apps destroy "$FLY_APP_NAME" --yes' C-m
# Delete remote branch
tmux send-keys -t e2e-fly 'git -C "$DSPY_CLI_DIR" push origin --delete "$TEMP_BRANCH"' C-m
# Return to main and delete local branch
tmux send-keys -t e2e-fly 'git -C "$DSPY_CLI_DIR" checkout main' C-m
tmux send-keys -t e2e-fly 'git -C "$DSPY_CLI_DIR" branch -D "$TEMP_BRANCH"' C-m
# Remove temp directory
tmux send-keys -t e2e-fly 'rm -rf "$TEST_DIR"' C-m
# Kill tmux session
tmux kill-session -t e2e-fly| Test | Expected Result |
|---|---|
| Health Check | {"status":"ok"} |
| Auth Redirect (no auth) | HTTP 303 |
| Auth Success (Bearer token) | JSON with QaModulePredict |
| LLM Execution | JSON with "answer" field |
After running cleanup, verify:
# No orphaned Fly apps
fly apps list | grep "dspy-e2e" || echo "Clean"
# No orphaned branches
git branch -r | grep "e2e-test/" || echo "Clean"The Dockerfile must include git installation. Ensure the Dockerfile has:
RUN apt-get update && apt-get install -y git && rm -rf /var/lib/apt/lists/*Use double quotes for the sed command, not single quotes:
sed -i.bak "s|...|...@$TEMP_BRANCH\"|" pyproject.toml # Correct
sed -i.bak 's|...|...|' pyproject.toml # Won't expand $TEMP_BRANCHdspy-cli new creates projects relative to the current working directory, not where it's run from. Move the project after creation:
mv "$DSPY_CLI_DIR/fly-e2e-test" "$TEST_DIR/"If any cleanup step fails, run them individually:
fly apps destroy "dspy-e2e-XXXX" --yes
git push origin --delete "e2e-test/XXXX"
git checkout main
git branch -D "e2e-test/XXXX"Use fly secrets to set any required env vars. Check the app logs to see which vars are missing:
# View logs to find missing env vars
fly logs --app "$FLY_APP_NAME" --no-tail
# Set additional secrets as needed
fly secrets set VAR_NAME="value" ANOTHER_VAR="value" --app "$FLY_APP_NAME"
# List current secrets
fly secrets list --app "$FLY_APP_NAME"Common env vars that might be needed:
OPENAI_API_KEY - Required for OpenAI modelsDSPY_API_KEY - Required when --auth is enabledsetup() method)dspy-e2e-{random} prevents conflicts© cmpnd-ai, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/fly-e2e-test of cmpnd-ai/dspy-cli.
Open the folder on GitHubat commit c3b667e
Fly E2E Test next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Fly E2E Test this skillcmpnd-ai/dspy-cli | 137 | — | ~2.3k | Automated safety check: Notes | MIT | |
| OpenHarness End-to-End EvalsHKUDS/OpenHarness | 16k | 1 repos | ~2.1k | Automated safety check: Notes | MIT | |
| Workflow Regression Testspurefunctor/purescript-iris | 117 | — | ~1.8k | Automated safety check: Pass | Custom licence | |
| Command Test Conventionsruby-git/ruby-git | 1.8k | — | ~7.8k | Automated safety check: Pass | MIT | |
| E2E Testinglangflow-ai/langflow | 156k | — | ~3.3k | Automated safety check: Pass | MIT | |
| MongoDB Source Connector E2E Harnessairbytehq/airbyte | 22k | — | ~1.9k | Automated safety check: Pass | Custom licence |
HKUDS/OpenHarness
Validates OpenHarness features by running real multi-turn agent loops with live LLM calls against an unfamiliar codebase, checking actual tool execution.
purefunctor/purescript-iris
Workflow for producing auditable Git or jj history for a known compiler bug fix.
ruby-git/ruby-git
Conventions for writing and reviewing unit and integration tests for Git::Commands:: classes.
langflow-ai/langflow
Write and review Playwright E2E tests for Langflow. An agent skill from langflow-ai/langflow.
airbytehq/airbyte
Starts a throwaway MongoDB 7.0 replica set and runs the Airbyte spec, check, discover and read commands against source-mongodb-v2 images for local end-to-end testing.
github/copilot-sdk
Creates a Java SDK end-to-end test for the Copilot SDK that runs against a recorded YAML snapshot through a replay proxy, so CI needs no real authentication.
cmpnd-ai/dspy-cli
Instructions for using tmux to spawn multiple processes, inspect them, and capture their output.
Works with
Categories
Deploy and test dspy-cli on Fly.io using local changes via temp git branch. Fly E2E Test is an agent skill from cmpnd-ai/dspy-cli.io using local changes via temp git branch.
Fly E2E Test fits situations like: tasks that involve Integration testing; tasks that involve End-to-end testing; tasks that involve Git workflow.
Run `npx skills add cmpnd-ai/dspy-cli --skill fly-e2e-test -a claude-code`. Or copy the skill folder (.claude/skills/fly-e2e-test in cmpnd-ai/dspy-cli) into .claude/skills/fly-e2e-test in your project. Claude Code loads it when a task matches its description.
Run `npx skills add cmpnd-ai/dspy-cli --skill fly-e2e-test -a codex`. Or copy the skill folder (.claude/skills/fly-e2e-test in cmpnd-ai/dspy-cli) into .agents/skills/fly-e2e-test in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add cmpnd-ai/dspy-cli --skill fly-e2e-test -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/fly-e2e-test, .gemini/skills/fly-e2e-test, .github/skills/fly-e2e-test and .opencode/skills/fly-e2e-test in your project.
Going by SKILL.md and its folder, Fly E2E Test needs the command-line tools its instructions call (fly, curl, git and apt-get) and credentials named OPENAI_API_KEY and DSPY_API_KEY. Our summary lists: A credential in OPENAI_API_KEY; A credential in DSPY_API_KEY. Its frontmatter pre-approves these tools: Bash.
SKILL.md contains no URLs. Its commands use curl and git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (mentions a .env file; pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Fly E2E Test is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.3k tokens (SKILL.md is roughly 9.2k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Fly E2E Test: OpenHarness End-to-End Evals (HKUDS/OpenHarness, 16k stars), Workflow Regression Tests (purefunctor/purescript-iris, 117 stars), Command Test Conventions (ruby-git/ruby-git, 1.8k stars) and E2E Testing (langflow-ai/langflow, 156k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
cmpnd-ai (a GitHub organization) maintains it in cmpnd-ai/dspy-cli, which has 137 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on March 3, 2026.
Source: cmpnd-ai/dspy-cli on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.