Skip to main content

Autonomous sprint-to-PR delivery agent. Reads Jira/Azure DevOps/GitHub tasks, delegates code edits to simplicio-cli, ships draft PRs with evidence.

Project description

SendSprint

SendSprint turns sprint work into validated pull requests

PyPI Python versions License

๐Ÿ‡บ๐Ÿ‡ธ English. Leia em portuguรชs: README.pt-BR.md.

SendSprint is an autonomous agent that finishes the cards assigned to you. It reads your sprint from Jira, Azure DevOps or GitHub Issues, rewrites each card into the simplicio-mapper spec format, hands the actual code edit to simplicio-cli, captures test + screen evidence, commits on an isolated branch, and opens a draft pull request with the evidence attached. Then it watches the PR and feeds your review comments back to simplicio until you approve.

You don't sit at the keyboard invoking it. A scheduled trigger runs it; your only job is to review the draft PR.

Contents

The split that makes it work

  • SendSprint = the agent (the brain). It owns the flow start to finish: read โ†’ map โ†’ execute โ†’ evidence โ†’ commit โ†’ PR โ†’ update ticket โ†’ review loop.
  • simplicio-cli = the executor (the hands). Stateless. It runs one task โ†’ applied diff. It knows nothing about sprints, branches or PRs.

This separation is the whole idea: the brain never writes code, and the hands never make decisions. Each can be tested and swapped independently.

The full pipeline

trigger (cron / GitHub Action / Claude web)   โ† removes you from the loop
  โ””โ”€ SendSprint (agent)
       0. update tools       latest simplicio-cli / -prompt / -mapper (per profile)
       1. read sprint        Jira / Azure DevOps / GitHub Issues   (mcp โ†’ api, --scope mine)
       2. map each card      โ†’ .specs/... plus project-map + precedent context
       2b. (optional) fan-out brainstorm via YOOL/TUPLE/HAMT lazy subagents
       3. simplicio task ... โ† the only thing simplicio-cli does (one task โ†’ diff)
       3b. collect evidence  tests + Playwright screenshot
       4. commit + push      isolated git worktree, bounded backoff
       5. open DRAFT PR      โ† your only review surface
       6. attach evidence    test results + screenshots + manifest
       7. update the ticket  "In Review" + PR link
       8. watch the PR       review comment? โ†’ simplicio revises โ†’ re-evidence
            โœ“ you approve โ†’ merge โ†’ next card

   โ€ฆand every step above is written to a log file (see Logging).

Demonstration: a frontend card, end to end

A committed simulation proves the whole pipeline for a frontend card, without needing live credentials or a browser in CI: tests/test_e2e_frontend_sim.py.

pytest tests/test_e2e_frontend_sim.py -q

The card "WEB-7 โ€” Add a Login button to the homepage header" arrives from Jira over MCP, and the test walks every stage:

  1. Collect the task from Jira (MCP transport) โ†’ a Sprint with the card.
  2. Map it into .specs/sprints/sprint-42/01-add-a-login-buttonโ€ฆtask.md (acceptance criteria become AC-1, AC-2).
  3. Execute โ€” the simulated edit adds the button to index.html (<a href="/login"><button>Login</button></a>), exactly as simplicio applies a diff.
  4. Evidence โ€” run tests and capture a screenshot committed under .sendsprint/evidence/WEB-7/screen.png.
  5. PR โ€” open a draft pull request with the evidence embedded.

The captured "print" of the delivered screen:

SendSprint frontend delivery evidence

โ€ฆand the evidence comment SendSprint posts on the PR:

## SendSprint evidence

### Steps
- [x] execute
- [x] evidence
- [x] commit

### Tests & screens
- โœ… **unit**: pytest โ€” exit 0
- โœ… **screenshot**: homepage

  ![homepage](https://raw.githubusercontent.com/acme/web/feature/web-7/.sendsprint/evidence/WEB-7/screen.png)

The committed test uses a tiny injected PNG so it runs anywhere; with Playwright installed (pip install -e ".[screenshot]" && playwright install chromium) the real flow captures a true screenshot of the running screen โ€” that's how the image above was produced.

Install

# 1) SendSprint itself (published on PyPI as `simplicio-sprint`)
#    This also pulls the current simplicio-cli / -mapper / -prompt packages.
pip install simplicio-sprint

# 2) optional: Playwright screen evidence
pip install "simplicio-sprint[screenshot]" && playwright install chromium

# 3) optional but recommended: pull the latest of every external tool
#    (also installs the simplicio-prompt kernel used by --fanout)
sendsprint update

Working on the agent itself? Clone the repo and pip install -e ".[dev]" instead.

Requirements: Python โ‰ฅ 3.11 and git. sendsprint update additionally needs git on PATH to clone the simplicio-prompt / simplicio-mapper helpers.

Configure credentials

Credentials are read from the OS keyring (via sendsprint login) or from environment variables. You only need the source(s) you actually use.

# one-time keyring storage
sendsprint login jira           # prompts for email + API token
sendsprint login azuredevops    # prompts for organization + PAT
# GitHub uses the GITHUB_TOKEN environment variable โ€” no keyring entry needed

Or via environment variables โ€” see Environment variables.

How to invoke it

There are two ways: directly via the CLI, or by asking an AI agent (Claude Code, Codex, Cursor, โ€ฆ) that has the SendSprint skill installed.

A) Directly, via the CLI

# Jira sprint 42
sendsprint run jira 42 --repo . --repo-slug owner/repo --scope mine

# Azure DevOps iteration (note the escaped backslash)
sendsprint run azuredevops "Team\\Sprint 12" --repo . --repo-slug repoId

# GitHub milestone #7 (or "*" for all open issues assigned to you)
sendsprint run github 7 --repo . --repo-slug owner/repo --scope mine

What the arguments mean:

Argument Meaning
<source> jira | azuredevops | github
<sprint> Jira sprint id, ADO iteration path, or GitHub milestone (* = all open)
--repo path to the target git repository
--repo-slug owner/repo (GitHub) or repository id (Azure DevOps) โ€” used for the PR
--scope mine deliver only the cards assigned to you (all for the whole sprint)
--base the PR target branch (default develop)
--fanout run the 600-subagent brainstorm per card (opt-in)
--no-specs skip writing the simplicio-mapper .specs/ file
-o report.json write the full run report as JSON

B) By asking an AI agent

If the skill is installed (see Install the skill), the host assistant never reimplements the flow โ€” it shells out to the sendsprint CLI. These phrases trigger it:

  • ๐Ÿ‡ง๐Ÿ‡ท "rode o sendsprint", "executar sprint", "entregar sprint"
  • ๐Ÿ‡บ๐Ÿ‡ธ "run sendsprint", "ship my sprint", "deliver my sprint"
  • ๐Ÿ‡ช๐Ÿ‡ธ "ejecutar sprint"
  • the slash command /sendsprint
  • or simply naming a sprint id + source + repo together

When your MCP servers (Atlassian / Azure DevOps / GitHub) are available, the agent registers them so the operators read live tenant state over MCP; otherwise the operators fall back to the REST API automatically.

Watch mode (the listener)

Watch mode is how SendSprint runs without you at the keyboard. It polls the source, delivers the cards you haven't delivered yet, and remembers what it already shipped so it never duplicates work.

# one pass and exit โ€” this is what a cron / GitHub Action / scheduled trigger calls
sendsprint watch jira 42 --repo . --repo-slug owner/repo --once

# stay alive and run a pass every 15 minutes (Ctrl-C to stop)
sendsprint watch jira 42 --repo . --repo-slug owner/repo --interval 15

# at most N cards per cycle (default 1 โ€” small, reviewable PRs)
sendsprint watch github "*" --repo . --repo-slug owner/repo --once --max-per-cycle 3

How it behaves:

  • It always scopes to your cards (--scope mine).
  • Delivered card keys are recorded in .sendsprint/runs/watch-state.json; the next pass skips them. Delete that file to re-deliver.
  • --once does a single cycle and exits with a non-zero code if any step failed (ideal for CI). Without --once it loops forever, one cycle per --interval minutes, and keeps running even if a cycle fails (the error is logged).
  • Each delivered card still stops at a draft PR โ€” watch mode never merges.

Schedule it

Run sendsprint watch ... --once from:

You can also keep an eye on the PR after it's open: an agent subscribed to PR activity reacts to review comments by running the review loop (below).

The simplicio-mapper specs

Before handing a card to simplicio-cli, SendSprint writes it into the simplicio-mapper format inside the worktree, so the executor has rich, structured context:

.specs/sprints/
โ”œโ”€โ”€ BACKLOG.md
โ””โ”€โ”€ sprint-XX/
    โ”œโ”€โ”€ SPRINT.md
    โ””โ”€โ”€ NN-slug.task.md     # frontmatter + Acceptance Criteria, Test plan, Definition of Done

Each task file carries the card's title, description, acceptance criteria (parsed into AC-1, AC-2, โ€ฆ), labels and ticket link. Turn it off with --no-specs.

When the target repo already has mapper artifacts, SendSprint also reads .simplicio/project-map.json and .simplicio/precedent-index.json. It ranks relevant files, recent changes, architecture signals and precedent snippets for the current card, embeds them under ## Structured mapper context, and passes that same compact context to simplicio-cli.

Real-stack evidence sprints

SendSprint treats Playwright + web + API + PostgreSQL/local database goals as analysis-first sprint work. Use plan-local for these ad-hoc efforts, then let the generated mapper specs drive the concrete execution slices:

sendsprint plan-local \
  --repo /path/to/repo \
  --sprint real-stack-evidence \
  --name "Real-stack evidence" \
  --goal "Use Playwright to prove web screens against API and local Postgres" \
  --task "REAL-STACK-EVIDENCE|Prove web screens|Run mapper endpoint checks, start real services, execute focused Playwright specs, and document artifacts."

The helper generate_real_stack_evidence_task() produces this standard task shape programmatically for planner integrations.

The 600-subagent fan-out

Optionally, before implementing a card, SendSprint can fan the task out across hundreds of real subagents via simplicio-prompt to brainstorm edge cases and a plan, then folds the result into the simplicio task. When SIMPLICIO_PROMPT_REPO points at a current simplicio-prompt checkout, SendSprint uses the YOOL/TUPLE/HAMT PromptFanout adapter and lazy batch_spawn receipts instead of enumerating workers. The older SIMPLICIO_PROMPT_KERNEL subprocess path remains as a fallback.

# 600 subagents per card (needs the kernel + a provider key)
sendsprint run jira 42 --repo . --repo-slug owner/repo --fanout

# offline cost preview โ€” no API key, no network
sendsprint run jira 42 --repo . --repo-slug owner/repo --fanout --fanout-dry-run

It is opt-in and degrades gracefully: with no tuple adapter, kernel or key it logs a skipped step and continues. sendsprint update installs the prompt checkout and points SIMPLICIO_PROMPT_KERNEL at the legacy kernel automatically.

Keeping the tools current

sendsprint update pulls the latest of every moving part:

sendsprint update                 # all three
sendsprint update --no-mapper     # skip simplicio-mapper
Tool How it updates
simplicio-cli pip install -U simplicio-cli
simplicio-prompt git clone/pull into the cache, sets SIMPLICIO_PROMPT_KERNEL
simplicio-mapper git clone/pull into the cache

run and watch also refresh tools at start, driven by your runtime profile (~/.config/sendsprint/profile.yaml). Skip it per-run with --no-update, or globally with SENDSPRINT_NO_UPDATE=1.

Install the skill into your IDE / agent

sendsprint install writes the SendSprint skill into each agent's own convention, from a single source, so the trigger phrases work everywhere.

sendsprint install --all                 # every supported agent
sendsprint install -t cursor -t claude    # just these
sendsprint install --all --repo /path/to/project
Agent Where the skill is written
Claude Code .claude/skills/sendsprint/SKILL.md
Cursor .cursor/rules/sendsprint.mdc
Kiro .kiro/steering/sendsprint.md
Gemini GEMINI.md (managed block)
Codex / OpenCode / Antigravity AGENTS.md (managed block)
Hermes / openclaw AGENTS.md (managed block โ€” fallback)

Shared files (AGENTS.md, GEMINI.md) get an idempotent managed block between markers, so re-running never clobbers your existing content.

Logging โ€” capture every step

Every command configures the sendsprint logger to a rotating log file (full DEBUG detail) plus the console. The log records each delivery step, every simplicio / fan-out invocation, transport choices and errors.

# global options (before the subcommand)
sendsprint --log-level DEBUG run jira 42 --repo . --repo-slug owner/repo
sendsprint --log-json --log-file ./run.jsonl run github "*" --repo .
  • Default location: ~/.local/state/sendsprint/logs/sendsprint.log (override with SENDSPRINT_LOG_DIR).
  • --log-json writes one JSON object per line (easy to ingest).
  • run also archives the full RunReport JSON next to the logs (run-<timestamp>.report.json).

Architecture

sendsprint/
โ”œโ”€โ”€ operators/      task readers: JiraOperator, AzureDevopsOperator, GitHubIssuesOperator (mcp|api)
โ”‚   โ””โ”€โ”€ _mcp_bridge.py  host-injected MCP seam (register_provider โ†’ fetch)
โ”œโ”€โ”€ executor/       SimplicioExecutor โ€” the boundary to simplicio-cli (task โ†’ applied diff)
โ”œโ”€โ”€ mapper/         MapperAdapter โ€” .specs/ tasks + project-map/precedent context
โ”œโ”€โ”€ prompt/         PromptFanout โ€” simplicio-prompt YOOL/TUPLE/HAMT fan-out
โ”œโ”€โ”€ delivery/       worktree, git_ops, evidence manifest, PR create/review
โ”œโ”€โ”€ models/         Sprint, SprintItem, StepReport, RunReport, ScopeConfig (Pydantic v2)
โ”œโ”€โ”€ github_integration.py  ReviewReader (PR feedback) + evidence comment posting + CI
โ”œโ”€โ”€ scope.py        --scope mine filtering
โ”œโ”€โ”€ bootstrap.py    sendsprint update (pull latest tools) + start-up checks
โ”œโ”€โ”€ installer.py    sendsprint install (write the skill per agent)
โ”œโ”€โ”€ logging_setup.py  central logging (file + console, JSON optional)
โ”œโ”€โ”€ flow.py         the orchestrator (read โ†’ map โ†’ simplicio โ†’ evidence โ†’ PR โ†’ review loop)
โ”œโ”€โ”€ watch.py        the unattended trigger
โ””โ”€โ”€ cli.py          Typer CLI: run, watch, update, install, login, logout, version

Environment variables

Variable For
JIRA_BASE_URL, JIRA_EMAIL, JIRA_API_TOKEN Jira
AZURE_DEVOPS_ORG, AZURE_DEVOPS_PROJECT, AZURE_DEVOPS_PAT Azure DevOps
GITHUB_TOKEN, GITHUB_REPO GitHub Issues + PRs
SIMPLICIO_MODEL, SIMPLICIO_BASE_URL, SIMPLICIO_TEST_CMD simplicio-cli
SIMPLICIO_PROMPT_REPO path to a simplicio-prompt checkout with examples/python/prompt_fanout.py
SIMPLICIO_PROMPT_KERNEL path to the fan-out kernel (auto-set by sendsprint update)
SENDSPRINT_CACHE_DIR where git-cloned tools live (default ~/.cache/sendsprint)
SENDSPRINT_LOG_DIR where logs live (default ~/.local/state/sendsprint/logs)
SENDSPRINT_NO_UPDATE set to 1 to skip the start-up tool update
SENDSPRINT_CONFIG_DIR profile location (default ~/.config/sendsprint)

Command reference

Command What it does
sendsprint run <source> <sprint> deliver a sprint: each card โ†’ simplicio โ†’ evidence โ†’ draft PR
sendsprint watch <source> <sprint> unattended trigger; --once for cron/CI, else loops
sendsprint update pull latest simplicio-cli / -prompt / -mapper
sendsprint install --all write the skill into every supported agent
sendsprint login <provider> store credentials in the OS keyring
sendsprint logout <provider> <account> remove a stored credential
sendsprint version print the version

Global options (before the subcommand): --log-level, --log-file, --log-json.

FAQ

Do I need simplicio-cli installed? For real code edits, yes (pip install simplicio-cli). Without it, the execute step is reported as skipped and no diff is produced โ€” the rest of the flow still runs so you can see the wiring.

What if I have no Jira/ADO/GitHub MCP server? No problem. Transport is auto: it tries MCP first (when the host registers a provider) and falls back to the REST API. Set the REST credentials and you're fine.

Does it ever merge or push to my main branch? No. It pushes the work to an isolated branch and opens a draft PR. You review and merge. Watch mode is the same โ€” it always stops at the draft PR.

Will it touch files outside the task? The executor is constrained to "touch only what the task requires; keep tests green". The mapper only ever writes under .specs/. The skill installer only writes its dedicated files or a marked block in AGENTS.md/GEMINI.md.

Is the 600-subagent fan-out required? No โ€” it's opt-in (--fanout) and skips gracefully without a kernel/key. Use --fanout-dry-run to preview cost offline.

A reviewer left a comment โ€” what happens? The review loop deduplicates actionable feedback, includes file/line context, re-runs simplicio to address it, re-collects fresh evidence, writes an evidence manifest, and pushes โ€” repeating until you approve. An agent subscribed to PR activity can drive this automatically.

Where do I see what happened? In the log file (~/.local/state/sendsprint/logs/sendsprint.log) and the archived RunReport JSON. Use --log-level DEBUG for full detail.

How do I re-deliver a card watch already shipped? Delete its key from (or remove) .sendsprint/runs/watch-state.json.

Tests

pip install -e ".[dev]"
pytest tests/ -q
ruff check sendsprint/ && ruff format sendsprint/

License

MIT โ€” see LICENSE.

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

simplicio_sprint-1.2.8.tar.gz (99.2 kB view details)

Uploaded Source

Built Distribution

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

simplicio_sprint-1.2.8-py3-none-any.whl (103.5 kB view details)

Uploaded Python 3

File details

Details for the file simplicio_sprint-1.2.8.tar.gz.

File metadata

  • Download URL: simplicio_sprint-1.2.8.tar.gz
  • Upload date:
  • Size: 99.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.5

File hashes

Hashes for simplicio_sprint-1.2.8.tar.gz
Algorithm Hash digest
SHA256 7da92f9ae9fb4e242c08218af8be752fd940fc1e327c68e17d335baa97dcbde7
MD5 b6488032b205b21a80d34e71a6e6e850
BLAKE2b-256 b1514806f3f8d73d0b61984d83de3ab73f92158b4d7620a52de4f3a377c32df7

See more details on using hashes here.

File details

Details for the file simplicio_sprint-1.2.8-py3-none-any.whl.

File metadata

File hashes

Hashes for simplicio_sprint-1.2.8-py3-none-any.whl
Algorithm Hash digest
SHA256 44e2cbcedadcd6222685cef622e44299f4a38440543d4250fa92ce241ab6040e
MD5 0da69acc3b72e4845e4bfdcc33b7e0a9
BLAKE2b-256 dcae4e64355b0ea057454e334717d700bc107e9546e062536093b47d5ad338a8

See more details on using hashes here.

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