simplicio-sprint 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- simplicio_sprint-1.0.0/.gitignore +60 -0
- simplicio_sprint-1.0.0/CHANGELOG.md +60 -0
- simplicio_sprint-1.0.0/LICENSE +21 -0
- simplicio_sprint-1.0.0/PKG-INFO +490 -0
- simplicio_sprint-1.0.0/README.md +436 -0
- simplicio_sprint-1.0.0/README.pt-BR.md +436 -0
- simplicio_sprint-1.0.0/docs/presentations/README.md +23 -0
- simplicio_sprint-1.0.0/pyproject.toml +76 -0
- simplicio_sprint-1.0.0/sendsprint/__init__.py +10 -0
- simplicio_sprint-1.0.0/sendsprint/bootstrap.py +170 -0
- simplicio_sprint-1.0.0/sendsprint/cli.py +333 -0
- simplicio_sprint-1.0.0/sendsprint/credentials.py +132 -0
- simplicio_sprint-1.0.0/sendsprint/delivery/__init__.py +20 -0
- simplicio_sprint-1.0.0/sendsprint/delivery/evidence.py +138 -0
- simplicio_sprint-1.0.0/sendsprint/delivery/git_ops.py +84 -0
- simplicio_sprint-1.0.0/sendsprint/delivery/pr.py +187 -0
- simplicio_sprint-1.0.0/sendsprint/delivery/worktree.py +74 -0
- simplicio_sprint-1.0.0/sendsprint/executor/__init__.py +23 -0
- simplicio_sprint-1.0.0/sendsprint/executor/simplicio.py +247 -0
- simplicio_sprint-1.0.0/sendsprint/flow.py +419 -0
- simplicio_sprint-1.0.0/sendsprint/github_integration.py +360 -0
- simplicio_sprint-1.0.0/sendsprint/installer.py +143 -0
- simplicio_sprint-1.0.0/sendsprint/llm/__init__.py +5 -0
- simplicio_sprint-1.0.0/sendsprint/llm/client.py +175 -0
- simplicio_sprint-1.0.0/sendsprint/logging_setup.py +87 -0
- simplicio_sprint-1.0.0/sendsprint/mapper/__init__.py +15 -0
- simplicio_sprint-1.0.0/sendsprint/mapper/adapter.py +283 -0
- simplicio_sprint-1.0.0/sendsprint/models/__init__.py +59 -0
- simplicio_sprint-1.0.0/sendsprint/models/reports.py +89 -0
- simplicio_sprint-1.0.0/sendsprint/models/sprint.py +116 -0
- simplicio_sprint-1.0.0/sendsprint/models/workspace.py +92 -0
- simplicio_sprint-1.0.0/sendsprint/operators/__init__.py +15 -0
- simplicio_sprint-1.0.0/sendsprint/operators/_mcp_bridge.py +79 -0
- simplicio_sprint-1.0.0/sendsprint/operators/azure_devops_operator.py +261 -0
- simplicio_sprint-1.0.0/sendsprint/operators/base.py +86 -0
- simplicio_sprint-1.0.0/sendsprint/operators/github_issues_operator.py +186 -0
- simplicio_sprint-1.0.0/sendsprint/operators/jira_operator.py +274 -0
- simplicio_sprint-1.0.0/sendsprint/profile.py +138 -0
- simplicio_sprint-1.0.0/sendsprint/prompt/__init__.py +14 -0
- simplicio_sprint-1.0.0/sendsprint/prompt/fanout.py +182 -0
- simplicio_sprint-1.0.0/sendsprint/scope.py +97 -0
- simplicio_sprint-1.0.0/sendsprint/tech/__init__.py +5 -0
- simplicio_sprint-1.0.0/sendsprint/tech/detector.py +288 -0
- simplicio_sprint-1.0.0/sendsprint/watch.py +94 -0
- simplicio_sprint-1.0.0/sendsprint/workspace/__init__.py +5 -0
- simplicio_sprint-1.0.0/sendsprint/workspace/loader.py +69 -0
- simplicio_sprint-1.0.0/skills/claude/SKILL.md +79 -0
- simplicio_sprint-1.0.0/skills/codex/AGENTS.md +46 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.so
|
|
6
|
+
.Python
|
|
7
|
+
build/
|
|
8
|
+
dist/
|
|
9
|
+
*.egg-info/
|
|
10
|
+
*.egg
|
|
11
|
+
pip-log.txt
|
|
12
|
+
pip-delete-this-directory.txt
|
|
13
|
+
|
|
14
|
+
# Virtual envs
|
|
15
|
+
.venv/
|
|
16
|
+
venv/
|
|
17
|
+
env/
|
|
18
|
+
ENV/
|
|
19
|
+
|
|
20
|
+
# Tests / coverage
|
|
21
|
+
.pytest_cache/
|
|
22
|
+
.coverage
|
|
23
|
+
.coverage.*
|
|
24
|
+
htmlcov/
|
|
25
|
+
.tox/
|
|
26
|
+
.cache
|
|
27
|
+
.mypy_cache/
|
|
28
|
+
.ruff_cache/
|
|
29
|
+
|
|
30
|
+
# IDE
|
|
31
|
+
.vscode/
|
|
32
|
+
.idea/
|
|
33
|
+
*.swp
|
|
34
|
+
*.swo
|
|
35
|
+
.DS_Store
|
|
36
|
+
|
|
37
|
+
# Local JS/runtime installs
|
|
38
|
+
node_modules/
|
|
39
|
+
|
|
40
|
+
# Env / secrets
|
|
41
|
+
.env
|
|
42
|
+
.env.local
|
|
43
|
+
.env.*.local
|
|
44
|
+
*.pem
|
|
45
|
+
*.key
|
|
46
|
+
|
|
47
|
+
# Playwright
|
|
48
|
+
test-results/
|
|
49
|
+
playwright-report/
|
|
50
|
+
playwright/.cache/
|
|
51
|
+
|
|
52
|
+
# SendSprint output
|
|
53
|
+
.sendsprint/
|
|
54
|
+
sprint-*.json
|
|
55
|
+
arch-report-*.json
|
|
56
|
+
evidence/
|
|
57
|
+
|
|
58
|
+
# Local Codex/browser run artifacts
|
|
59
|
+
.codex-layout-shots/
|
|
60
|
+
.codex-web-expo.*.log
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 3.0.0
|
|
4
|
+
|
|
5
|
+
First public release on PyPI. Bundles the simplicio-mapper + MCP integration, the
|
|
6
|
+
simplicio-prompt subagent fan-out, `sendsprint update`, the multi-agent
|
|
7
|
+
`sendsprint install`, central logging, the didactic EN/PT README and the
|
|
8
|
+
end-to-end frontend demonstration. Published via GitHub Actions Trusted
|
|
9
|
+
Publishing (`.github/workflows/publish.yml`); the source distribution ships only
|
|
10
|
+
the package (no videos / slide decks).
|
|
11
|
+
|
|
12
|
+
## 1.1.0
|
|
13
|
+
|
|
14
|
+
simplicio-mapper + MCP integration, plus the simplicio-prompt subagent fan-out.
|
|
15
|
+
|
|
16
|
+
- **MCP transport now works.** A host-injected seam
|
|
17
|
+
(`operators/_mcp_bridge.py`) lets the agent feed MCP tool results to the Jira /
|
|
18
|
+
Azure DevOps / GitHub operators, which reuse their REST→`Sprint` mappers. With
|
|
19
|
+
no provider registered, `auto` transport falls back to REST as before.
|
|
20
|
+
- **simplicio-mapper adapter** (`mapper/`): renders a `Sprint` into the
|
|
21
|
+
`.specs/sprints/sprint-XX/` format (`SPRINT.md`, `BACKLOG.md`, and one
|
|
22
|
+
`NN-slug.task.md` per card with frontmatter + Acceptance Criteria, Test plan,
|
|
23
|
+
Definition of Done). The flow writes each card's spec into the worktree so
|
|
24
|
+
simplicio-cli has structured context.
|
|
25
|
+
- **simplicio-prompt fan-out** (`prompt/`): `PromptFanout` shells out to the
|
|
26
|
+
Tuple-Space + Yool kernel (`--subagents 600`) to brainstorm edge cases and a
|
|
27
|
+
plan per card, folding the result into the simplicio task. Opt-in via
|
|
28
|
+
`sendsprint run --fanout`; degrades gracefully when the kernel is absent.
|
|
29
|
+
- **`sendsprint update`** (`bootstrap.py`): pulls the latest simplicio-cli (pip),
|
|
30
|
+
simplicio-prompt kernel (git) and simplicio-mapper (git), and wires the
|
|
31
|
+
previously-inert `verify_dependencies_on_start` / `update_*_on_start` profile
|
|
32
|
+
flags so `run`/`watch` refresh tools at start (`--no-update` /
|
|
33
|
+
`SENDSPRINT_NO_UPDATE=1` to skip). The fan-out auto-discovers the cached kernel.
|
|
34
|
+
- **`sendsprint install`** (`installer.py`): writes the SendSprint skill into each
|
|
35
|
+
agent's convention — Cursor, Claude, Kiro (dedicated files) and Codex /
|
|
36
|
+
OpenCode / Antigravity / Gemini / Hermes / openclaw (idempotent managed block in
|
|
37
|
+
`AGENTS.md` / `GEMINI.md`, never clobbering existing content). `--target` or
|
|
38
|
+
`--all`.
|
|
39
|
+
- **Central logging** (`logging_setup.py`): every command configures the
|
|
40
|
+
`sendsprint` logger to a rotating file (DEBUG) plus console; `--log-level`,
|
|
41
|
+
`--log-file`, `--log-json` are global options. The flow logs each delivery step,
|
|
42
|
+
and `run` archives the `RunReport` JSON next to the logs.
|
|
43
|
+
|
|
44
|
+
## 1.0.0
|
|
45
|
+
|
|
46
|
+
Full rewrite around the simplicio-cli executor model.
|
|
47
|
+
|
|
48
|
+
- **SendSprint is the agent; simplicio-cli is the executor.** Each task is sent
|
|
49
|
+
to `simplicio task` (one task → applied diff); SendSprint owns branching,
|
|
50
|
+
evidence, commits, PRs and the review loop.
|
|
51
|
+
- Task sources: Jira, Azure DevOps, and **GitHub Issues** (new), transport mcp → api.
|
|
52
|
+
- Delivery layer: worktree isolation, commit + push with backoff, evidence
|
|
53
|
+
(tests + Playwright screenshots), draft PR creation with embedded evidence.
|
|
54
|
+
- PR review loop: `revise_pr` feeds reviewer feedback back to simplicio and
|
|
55
|
+
re-collects evidence.
|
|
56
|
+
- Unattended trigger: `sendsprint watch ... --once` (cron / GitHub Action /
|
|
57
|
+
Claude Code on the web scheduled trigger), scoped with `--scope mine`.
|
|
58
|
+
- Removed the previous web/dashboard/API surfaces, the v2 cloud provider
|
|
59
|
+
adapters, the yool/tuple/HAMT runtime, and the multi-IDE plugin packages —
|
|
60
|
+
the repo is now just the agent flow.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Wesley Simplicio
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: simplicio-sprint
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Autonomous sprint-to-PR delivery agent. Reads Jira/Azure DevOps/GitHub tasks, delegates code edits to simplicio-cli, ships draft PRs with evidence.
|
|
5
|
+
Project-URL: Homepage, https://github.com/wesleysimplicio/simplicio-sprint
|
|
6
|
+
Project-URL: Repository, https://github.com/wesleysimplicio/simplicio-sprint
|
|
7
|
+
Project-URL: Issues, https://github.com/wesleysimplicio/simplicio-sprint/issues
|
|
8
|
+
Author-email: Wesley Simplicio <wesleybob4@gmail.com>
|
|
9
|
+
License: MIT License
|
|
10
|
+
|
|
11
|
+
Copyright (c) 2026 Wesley Simplicio
|
|
12
|
+
|
|
13
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
14
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
15
|
+
in the Software without restriction, including without limitation the rights
|
|
16
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
17
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
18
|
+
furnished to do so, subject to the following conditions:
|
|
19
|
+
|
|
20
|
+
The above copyright notice and this permission notice shall be included in all
|
|
21
|
+
copies or substantial portions of the Software.
|
|
22
|
+
|
|
23
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
24
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
25
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
26
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
27
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
28
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
29
|
+
SOFTWARE.
|
|
30
|
+
License-File: LICENSE
|
|
31
|
+
Keywords: agent,automation,azure-devops,github,jira,simplicio-cli,sprint
|
|
32
|
+
Classifier: Development Status :: 4 - Beta
|
|
33
|
+
Classifier: Intended Audience :: Developers
|
|
34
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
35
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
36
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
37
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
38
|
+
Requires-Python: >=3.11
|
|
39
|
+
Requires-Dist: httpx>=0.27.0
|
|
40
|
+
Requires-Dist: pydantic>=2.7.0
|
|
41
|
+
Requires-Dist: pyyaml>=6.0.1
|
|
42
|
+
Requires-Dist: rich>=13.7.0
|
|
43
|
+
Requires-Dist: typer>=0.12.0
|
|
44
|
+
Provides-Extra: dev
|
|
45
|
+
Requires-Dist: mypy>=1.11.0; extra == 'dev'
|
|
46
|
+
Requires-Dist: pytest-cov>=5.0.0; extra == 'dev'
|
|
47
|
+
Requires-Dist: pytest>=8.3.0; extra == 'dev'
|
|
48
|
+
Requires-Dist: ruff>=0.6.0; extra == 'dev'
|
|
49
|
+
Provides-Extra: keyring
|
|
50
|
+
Requires-Dist: keyring>=25.0.0; extra == 'keyring'
|
|
51
|
+
Provides-Extra: screenshot
|
|
52
|
+
Requires-Dist: playwright>=1.48.0; extra == 'screenshot'
|
|
53
|
+
Description-Content-Type: text/markdown
|
|
54
|
+
|
|
55
|
+
# SendSprint
|
|
56
|
+
|
|
57
|
+
<p align="center">
|
|
58
|
+
<img src="./docs/assets/sendsprint-hero.png" alt="SendSprint turns sprint work into validated pull requests" />
|
|
59
|
+
</p>
|
|
60
|
+
|
|
61
|
+
> 🇺🇸 English. Leia em português: [README.pt-BR.md](README.pt-BR.md).
|
|
62
|
+
|
|
63
|
+
**SendSprint is an autonomous agent that finishes the cards assigned to you.**
|
|
64
|
+
It reads your sprint from **Jira**, **Azure DevOps** or **GitHub Issues**,
|
|
65
|
+
rewrites each card into the **[simplicio-mapper](https://github.com/wesleysimplicio/simplicio-mapper)**
|
|
66
|
+
spec format, hands the actual code edit to
|
|
67
|
+
**[simplicio-cli](https://github.com/wesleysimplicio/simplicio-cli)**, captures
|
|
68
|
+
test + screen evidence, commits on an isolated branch, and opens a **draft pull
|
|
69
|
+
request** with the evidence attached. Then it watches the PR and feeds your
|
|
70
|
+
review comments back to simplicio until you approve.
|
|
71
|
+
|
|
72
|
+
You don't sit at the keyboard invoking it. A scheduled trigger runs it; your
|
|
73
|
+
only job is to **review the draft PR**.
|
|
74
|
+
|
|
75
|
+
## Contents
|
|
76
|
+
|
|
77
|
+
- [The split that makes it work](#the-split-that-makes-it-work)
|
|
78
|
+
- [The full pipeline](#the-full-pipeline)
|
|
79
|
+
- [Demonstration: a frontend card, end to end](#demonstration-a-frontend-card-end-to-end)
|
|
80
|
+
- [Install](#install)
|
|
81
|
+
- [Configure credentials](#configure-credentials)
|
|
82
|
+
- [How to invoke it](#how-to-invoke-it)
|
|
83
|
+
- [Watch mode (the listener)](#watch-mode-the-listener)
|
|
84
|
+
- [The simplicio-mapper specs](#the-simplicio-mapper-specs)
|
|
85
|
+
- [The 600-subagent fan-out](#the-600-subagent-fan-out)
|
|
86
|
+
- [Keeping the tools current](#keeping-the-tools-current)
|
|
87
|
+
- [Install the skill into your IDE / agent](#install-the-skill-into-your-ide--agent)
|
|
88
|
+
- [Logging — capture every step](#logging--capture-every-step)
|
|
89
|
+
- [Architecture](#architecture)
|
|
90
|
+
- [Environment variables](#environment-variables)
|
|
91
|
+
- [Command reference](#command-reference)
|
|
92
|
+
- [FAQ](#faq)
|
|
93
|
+
- [Tests](#tests) · [License](#license)
|
|
94
|
+
|
|
95
|
+
## The split that makes it work
|
|
96
|
+
|
|
97
|
+
- **SendSprint = the agent (the brain).** It owns the flow start to finish:
|
|
98
|
+
read → map → execute → evidence → commit → PR → update ticket → review loop.
|
|
99
|
+
- **simplicio-cli = the executor (the hands).** Stateless. It runs *one task →
|
|
100
|
+
applied diff*. It knows nothing about sprints, branches or PRs.
|
|
101
|
+
|
|
102
|
+
This separation is the whole idea: the brain never writes code, and the hands
|
|
103
|
+
never make decisions. Each can be tested and swapped independently.
|
|
104
|
+
|
|
105
|
+
## The full pipeline
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
trigger (cron / GitHub Action / Claude web) ← removes you from the loop
|
|
109
|
+
└─ SendSprint (agent)
|
|
110
|
+
0. update tools latest simplicio-cli / -prompt / -mapper (per profile)
|
|
111
|
+
1. read sprint Jira / Azure DevOps / GitHub Issues (mcp → api, --scope mine)
|
|
112
|
+
2. map each card → .specs/sprints/sprint-XX/NN-slug.task.md (simplicio-mapper format)
|
|
113
|
+
2b. (optional) fan-out brainstorm edge cases with 600 simplicio-prompt subagents
|
|
114
|
+
3. simplicio task ... ← the only thing simplicio-cli does (one task → diff)
|
|
115
|
+
3b. collect evidence tests + Playwright screenshot
|
|
116
|
+
4. commit + push isolated git worktree, bounded backoff
|
|
117
|
+
5. open DRAFT PR ← your only review surface
|
|
118
|
+
6. attach evidence test results + embedded screenshots
|
|
119
|
+
7. update the ticket "In Review" + PR link
|
|
120
|
+
8. watch the PR review comment? → simplicio revises → re-evidence
|
|
121
|
+
✓ you approve → merge → next card
|
|
122
|
+
|
|
123
|
+
…and every step above is written to a log file (see Logging).
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Demonstration: a frontend card, end to end
|
|
127
|
+
|
|
128
|
+
A committed simulation proves the whole pipeline for a **frontend card**, without
|
|
129
|
+
needing live credentials or a browser in CI:
|
|
130
|
+
[`tests/test_e2e_frontend_sim.py`](./tests/test_e2e_frontend_sim.py).
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
pytest tests/test_e2e_frontend_sim.py -q
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
The card "**WEB-7 — Add a Login button to the homepage header**" arrives from
|
|
137
|
+
Jira **over MCP**, and the test walks every stage:
|
|
138
|
+
|
|
139
|
+
1. **Collect** the task from Jira (MCP transport) → a `Sprint` with the card.
|
|
140
|
+
2. **Map** it into `.specs/sprints/sprint-42/01-add-a-login-button…task.md`
|
|
141
|
+
(acceptance criteria become `AC-1`, `AC-2`).
|
|
142
|
+
3. **Execute** — the simulated edit adds the button to `index.html`
|
|
143
|
+
(`<a href="/login"><button>Login</button></a>`), exactly as simplicio applies a diff.
|
|
144
|
+
4. **Evidence** — run tests and capture a **screenshot** committed under
|
|
145
|
+
`.sendsprint/evidence/WEB-7/screen.png`.
|
|
146
|
+
5. **PR** — open a **draft** pull request with the evidence embedded.
|
|
147
|
+
|
|
148
|
+
The captured "print" of the delivered screen:
|
|
149
|
+
|
|
150
|
+

|
|
151
|
+
|
|
152
|
+
…and the evidence comment SendSprint posts on the PR:
|
|
153
|
+
|
|
154
|
+
```markdown
|
|
155
|
+
## SendSprint evidence
|
|
156
|
+
|
|
157
|
+
### Steps
|
|
158
|
+
- [x] execute
|
|
159
|
+
- [x] evidence
|
|
160
|
+
- [x] commit
|
|
161
|
+
|
|
162
|
+
### Tests & screens
|
|
163
|
+
- ✅ **unit**: pytest — exit 0
|
|
164
|
+
- ✅ **screenshot**: homepage
|
|
165
|
+
|
|
166
|
+

|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
> The committed test uses a tiny injected PNG so it runs anywhere; with Playwright
|
|
170
|
+
> installed (`pip install -e ".[screenshot]" && playwright install chromium`) the
|
|
171
|
+
> real flow captures a true screenshot of the running screen — that's how the image
|
|
172
|
+
> above was produced.
|
|
173
|
+
|
|
174
|
+
## Install
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
# 1) SendSprint itself
|
|
178
|
+
pip install -e .
|
|
179
|
+
|
|
180
|
+
# 2) the executor (required for real code edits)
|
|
181
|
+
pip install simplicio-cli
|
|
182
|
+
|
|
183
|
+
# 3) optional: Playwright screen evidence
|
|
184
|
+
pip install -e ".[screenshot]" && playwright install chromium
|
|
185
|
+
|
|
186
|
+
# 4) optional but recommended: pull the latest of every external tool
|
|
187
|
+
# (also installs the simplicio-prompt kernel used by --fanout)
|
|
188
|
+
sendsprint update
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Requirements: **Python ≥ 3.11** and **git**. `sendsprint update` additionally
|
|
192
|
+
needs `git` on PATH to clone the simplicio-prompt / simplicio-mapper helpers.
|
|
193
|
+
|
|
194
|
+
## Configure credentials
|
|
195
|
+
|
|
196
|
+
Credentials are read from the OS keyring (via `sendsprint login`) or from
|
|
197
|
+
environment variables. You only need the source(s) you actually use.
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
# one-time keyring storage
|
|
201
|
+
sendsprint login jira # prompts for email + API token
|
|
202
|
+
sendsprint login azuredevops # prompts for organization + PAT
|
|
203
|
+
# GitHub uses the GITHUB_TOKEN environment variable — no keyring entry needed
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
Or via environment variables — see [Environment variables](#environment-variables).
|
|
207
|
+
|
|
208
|
+
## How to invoke it
|
|
209
|
+
|
|
210
|
+
There are two ways: **directly via the CLI**, or **by asking an AI agent**
|
|
211
|
+
(Claude Code, Codex, Cursor, …) that has the SendSprint skill installed.
|
|
212
|
+
|
|
213
|
+
### A) Directly, via the CLI
|
|
214
|
+
|
|
215
|
+
```bash
|
|
216
|
+
# Jira sprint 42
|
|
217
|
+
sendsprint run jira 42 --repo . --repo-slug owner/repo --scope mine
|
|
218
|
+
|
|
219
|
+
# Azure DevOps iteration (note the escaped backslash)
|
|
220
|
+
sendsprint run azuredevops "Team\\Sprint 12" --repo . --repo-slug repoId
|
|
221
|
+
|
|
222
|
+
# GitHub milestone #7 (or "*" for all open issues assigned to you)
|
|
223
|
+
sendsprint run github 7 --repo . --repo-slug owner/repo --scope mine
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
What the arguments mean:
|
|
227
|
+
|
|
228
|
+
| Argument | Meaning |
|
|
229
|
+
|---|---|
|
|
230
|
+
| `<source>` | `jira` \| `azuredevops` \| `github` |
|
|
231
|
+
| `<sprint>` | Jira sprint id, ADO iteration path, or GitHub milestone (`*` = all open) |
|
|
232
|
+
| `--repo` | path to the target git repository |
|
|
233
|
+
| `--repo-slug` | `owner/repo` (GitHub) or repository id (Azure DevOps) — used for the PR |
|
|
234
|
+
| `--scope mine` | deliver only the cards assigned to you (`all` for the whole sprint) |
|
|
235
|
+
| `--base` | the PR target branch (default `develop`) |
|
|
236
|
+
| `--fanout` | run the 600-subagent brainstorm per card (opt-in) |
|
|
237
|
+
| `--no-specs` | skip writing the simplicio-mapper `.specs/` file |
|
|
238
|
+
| `-o report.json` | write the full run report as JSON |
|
|
239
|
+
|
|
240
|
+
### B) By asking an AI agent
|
|
241
|
+
|
|
242
|
+
If the skill is installed (see
|
|
243
|
+
[Install the skill](#install-the-skill-into-your-ide--agent)), the host
|
|
244
|
+
assistant **never reimplements the flow — it shells out to the `sendsprint`
|
|
245
|
+
CLI**. These phrases trigger it:
|
|
246
|
+
|
|
247
|
+
- 🇧🇷 "rode o sendsprint", "executar sprint", "entregar sprint"
|
|
248
|
+
- 🇺🇸 "run sendsprint", "ship my sprint", "deliver my sprint"
|
|
249
|
+
- 🇪🇸 "ejecutar sprint"
|
|
250
|
+
- the slash command `/sendsprint`
|
|
251
|
+
- or simply naming a sprint id + source + repo together
|
|
252
|
+
|
|
253
|
+
When your MCP servers (Atlassian / Azure DevOps / GitHub) are available, the
|
|
254
|
+
agent registers them so the operators read live tenant state over MCP; otherwise
|
|
255
|
+
the operators fall back to the REST API automatically.
|
|
256
|
+
|
|
257
|
+
## Watch mode (the listener)
|
|
258
|
+
|
|
259
|
+
Watch mode is how SendSprint **runs without you at the keyboard**. It polls the
|
|
260
|
+
source, delivers the cards you haven't delivered yet, and remembers what it
|
|
261
|
+
already shipped so it never duplicates work.
|
|
262
|
+
|
|
263
|
+
```bash
|
|
264
|
+
# one pass and exit — this is what a cron / GitHub Action / scheduled trigger calls
|
|
265
|
+
sendsprint watch jira 42 --repo . --repo-slug owner/repo --once
|
|
266
|
+
|
|
267
|
+
# stay alive and run a pass every 15 minutes (Ctrl-C to stop)
|
|
268
|
+
sendsprint watch jira 42 --repo . --repo-slug owner/repo --interval 15
|
|
269
|
+
|
|
270
|
+
# at most N cards per cycle (default 1 — small, reviewable PRs)
|
|
271
|
+
sendsprint watch github "*" --repo . --repo-slug owner/repo --once --max-per-cycle 3
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
How it behaves:
|
|
275
|
+
|
|
276
|
+
- It always scopes to **your** cards (`--scope mine`).
|
|
277
|
+
- Delivered card keys are recorded in **`.sendsprint/runs/watch-state.json`**; the
|
|
278
|
+
next pass skips them. Delete that file to re-deliver.
|
|
279
|
+
- `--once` does a single cycle and exits with a non-zero code if any step failed
|
|
280
|
+
(ideal for CI). Without `--once` it loops forever, one cycle per `--interval`
|
|
281
|
+
minutes, and **keeps running even if a cycle fails** (the error is logged).
|
|
282
|
+
- Each delivered card still stops at a **draft PR** — watch mode never merges.
|
|
283
|
+
|
|
284
|
+
### Schedule it
|
|
285
|
+
|
|
286
|
+
Run `sendsprint watch ... --once` from:
|
|
287
|
+
|
|
288
|
+
- a **GitHub Action** on a schedule — see
|
|
289
|
+
[`.github/workflows/sendsprint.yml`](./.github/workflows/sendsprint.yml);
|
|
290
|
+
- a **cron job**;
|
|
291
|
+
- a **Claude Code on the web** scheduled trigger
|
|
292
|
+
([docs](https://code.claude.com/docs/en/claude-code-on-the-web)).
|
|
293
|
+
|
|
294
|
+
You can also keep an eye on the PR after it's open: an agent subscribed to PR
|
|
295
|
+
activity reacts to review comments by running the review loop (below).
|
|
296
|
+
|
|
297
|
+
## The simplicio-mapper specs
|
|
298
|
+
|
|
299
|
+
Before handing a card to simplicio-cli, SendSprint writes it into the
|
|
300
|
+
[simplicio-mapper](https://github.com/wesleysimplicio/simplicio-mapper) format
|
|
301
|
+
inside the worktree, so the executor has rich, structured context:
|
|
302
|
+
|
|
303
|
+
```
|
|
304
|
+
.specs/sprints/
|
|
305
|
+
├── BACKLOG.md
|
|
306
|
+
└── sprint-XX/
|
|
307
|
+
├── SPRINT.md
|
|
308
|
+
└── NN-slug.task.md # frontmatter + Acceptance Criteria, Test plan, Definition of Done
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
Each task file carries the card's title, description, acceptance criteria
|
|
312
|
+
(parsed into `AC-1`, `AC-2`, …), labels and ticket link. Turn it off with
|
|
313
|
+
`--no-specs`.
|
|
314
|
+
|
|
315
|
+
## The 600-subagent fan-out
|
|
316
|
+
|
|
317
|
+
Optionally, before implementing a card, SendSprint can fan the task out across
|
|
318
|
+
**hundreds of real subagents** via
|
|
319
|
+
[simplicio-prompt](https://github.com/wesleysimplicio/simplicio-prompt) to
|
|
320
|
+
brainstorm edge cases and a plan, then folds the result into the simplicio task.
|
|
321
|
+
|
|
322
|
+
```bash
|
|
323
|
+
# 600 subagents per card (needs the kernel + a provider key)
|
|
324
|
+
sendsprint run jira 42 --repo . --repo-slug owner/repo --fanout
|
|
325
|
+
|
|
326
|
+
# offline cost preview — no API key, no network
|
|
327
|
+
sendsprint run jira 42 --repo . --repo-slug owner/repo --fanout --fanout-dry-run
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
It is **opt-in** and **degrades gracefully**: with no kernel or key it logs a
|
|
331
|
+
`skipped` step and continues. `sendsprint update` installs the kernel and points
|
|
332
|
+
`SIMPLICIO_PROMPT_KERNEL` at it automatically.
|
|
333
|
+
|
|
334
|
+
## Keeping the tools current
|
|
335
|
+
|
|
336
|
+
`sendsprint update` pulls the latest of every moving part:
|
|
337
|
+
|
|
338
|
+
```bash
|
|
339
|
+
sendsprint update # all three
|
|
340
|
+
sendsprint update --no-mapper # skip simplicio-mapper
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
| Tool | How it updates |
|
|
344
|
+
|---|---|
|
|
345
|
+
| simplicio-cli | `pip install -U simplicio-cli` |
|
|
346
|
+
| simplicio-prompt | git clone/pull into the cache, sets `SIMPLICIO_PROMPT_KERNEL` |
|
|
347
|
+
| simplicio-mapper | git clone/pull into the cache |
|
|
348
|
+
|
|
349
|
+
`run` and `watch` also refresh tools at start, driven by your runtime profile
|
|
350
|
+
(`~/.config/sendsprint/profile.yaml`). Skip it per-run with `--no-update`, or
|
|
351
|
+
globally with `SENDSPRINT_NO_UPDATE=1`.
|
|
352
|
+
|
|
353
|
+
## Install the skill into your IDE / agent
|
|
354
|
+
|
|
355
|
+
`sendsprint install` writes the SendSprint skill into each agent's own
|
|
356
|
+
convention, from a single source, so the trigger phrases work everywhere.
|
|
357
|
+
|
|
358
|
+
```bash
|
|
359
|
+
sendsprint install --all # every supported agent
|
|
360
|
+
sendsprint install -t cursor -t claude # just these
|
|
361
|
+
sendsprint install --all --repo /path/to/project
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
| Agent | Where the skill is written |
|
|
365
|
+
|---|---|
|
|
366
|
+
| Claude Code | `.claude/skills/sendsprint/SKILL.md` |
|
|
367
|
+
| Cursor | `.cursor/rules/sendsprint.mdc` |
|
|
368
|
+
| Kiro | `.kiro/steering/sendsprint.md` |
|
|
369
|
+
| Gemini | `GEMINI.md` (managed block) |
|
|
370
|
+
| Codex / OpenCode / Antigravity | `AGENTS.md` (managed block) |
|
|
371
|
+
| Hermes / openclaw | `AGENTS.md` (managed block — fallback) |
|
|
372
|
+
|
|
373
|
+
Shared files (`AGENTS.md`, `GEMINI.md`) get an **idempotent managed block**
|
|
374
|
+
between markers, so re-running never clobbers your existing content.
|
|
375
|
+
|
|
376
|
+
## Logging — capture every step
|
|
377
|
+
|
|
378
|
+
Every command configures the `sendsprint` logger to a **rotating log file** (full
|
|
379
|
+
DEBUG detail) plus the console. The log records each delivery step, every
|
|
380
|
+
simplicio / fan-out invocation, transport choices and errors.
|
|
381
|
+
|
|
382
|
+
```bash
|
|
383
|
+
# global options (before the subcommand)
|
|
384
|
+
sendsprint --log-level DEBUG run jira 42 --repo . --repo-slug owner/repo
|
|
385
|
+
sendsprint --log-json --log-file ./run.jsonl run github "*" --repo .
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
- Default location: `~/.local/state/sendsprint/logs/sendsprint.log` (override with
|
|
389
|
+
`SENDSPRINT_LOG_DIR`).
|
|
390
|
+
- `--log-json` writes one JSON object per line (easy to ingest).
|
|
391
|
+
- `run` also archives the full `RunReport` JSON next to the logs
|
|
392
|
+
(`run-<timestamp>.report.json`).
|
|
393
|
+
|
|
394
|
+
## Architecture
|
|
395
|
+
|
|
396
|
+
```
|
|
397
|
+
sendsprint/
|
|
398
|
+
├── operators/ task readers: JiraOperator, AzureDevopsOperator, GitHubIssuesOperator (mcp|api)
|
|
399
|
+
│ └── _mcp_bridge.py host-injected MCP seam (register_provider → fetch)
|
|
400
|
+
├── executor/ SimplicioExecutor — the boundary to simplicio-cli (task → applied diff)
|
|
401
|
+
├── mapper/ MapperAdapter — render a Sprint into simplicio-mapper .specs/ tasks
|
|
402
|
+
├── prompt/ PromptFanout — simplicio-prompt subagent fan-out (--subagents 600)
|
|
403
|
+
├── delivery/ worktree, git_ops (commit+push), evidence (tests+screens), pr (create+review)
|
|
404
|
+
├── models/ Sprint, SprintItem, StepReport, RunReport, ScopeConfig (Pydantic v2)
|
|
405
|
+
├── github_integration.py ReviewReader (PR feedback) + evidence comment posting + CI
|
|
406
|
+
├── scope.py --scope mine filtering
|
|
407
|
+
├── bootstrap.py sendsprint update (pull latest tools) + start-up checks
|
|
408
|
+
├── installer.py sendsprint install (write the skill per agent)
|
|
409
|
+
├── logging_setup.py central logging (file + console, JSON optional)
|
|
410
|
+
├── flow.py the orchestrator (read → map → simplicio → evidence → PR → review loop)
|
|
411
|
+
├── watch.py the unattended trigger
|
|
412
|
+
└── cli.py Typer CLI: run, watch, update, install, login, logout, version
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
## Environment variables
|
|
416
|
+
|
|
417
|
+
| Variable | For |
|
|
418
|
+
|---|---|
|
|
419
|
+
| `JIRA_BASE_URL`, `JIRA_EMAIL`, `JIRA_API_TOKEN` | Jira |
|
|
420
|
+
| `AZURE_DEVOPS_ORG`, `AZURE_DEVOPS_PROJECT`, `AZURE_DEVOPS_PAT` | Azure DevOps |
|
|
421
|
+
| `GITHUB_TOKEN`, `GITHUB_REPO` | GitHub Issues + PRs |
|
|
422
|
+
| `SIMPLICIO_MODEL`, `SIMPLICIO_BASE_URL`, `SIMPLICIO_TEST_CMD` | simplicio-cli |
|
|
423
|
+
| `SIMPLICIO_PROMPT_KERNEL` | path to the fan-out kernel (auto-set by `sendsprint update`) |
|
|
424
|
+
| `SENDSPRINT_CACHE_DIR` | where git-cloned tools live (default `~/.cache/sendsprint`) |
|
|
425
|
+
| `SENDSPRINT_LOG_DIR` | where logs live (default `~/.local/state/sendsprint/logs`) |
|
|
426
|
+
| `SENDSPRINT_NO_UPDATE` | set to `1` to skip the start-up tool update |
|
|
427
|
+
| `SENDSPRINT_CONFIG_DIR` | profile location (default `~/.config/sendsprint`) |
|
|
428
|
+
|
|
429
|
+
## Command reference
|
|
430
|
+
|
|
431
|
+
| Command | What it does |
|
|
432
|
+
|---|---|
|
|
433
|
+
| `sendsprint run <source> <sprint>` | deliver a sprint: each card → simplicio → evidence → draft PR |
|
|
434
|
+
| `sendsprint watch <source> <sprint>` | unattended trigger; `--once` for cron/CI, else loops |
|
|
435
|
+
| `sendsprint update` | pull latest simplicio-cli / -prompt / -mapper |
|
|
436
|
+
| `sendsprint install --all` | write the skill into every supported agent |
|
|
437
|
+
| `sendsprint login <provider>` | store credentials in the OS keyring |
|
|
438
|
+
| `sendsprint logout <provider> <account>` | remove a stored credential |
|
|
439
|
+
| `sendsprint version` | print the version |
|
|
440
|
+
|
|
441
|
+
Global options (before the subcommand): `--log-level`, `--log-file`, `--log-json`.
|
|
442
|
+
|
|
443
|
+
## FAQ
|
|
444
|
+
|
|
445
|
+
**Do I need simplicio-cli installed?**
|
|
446
|
+
For real code edits, yes (`pip install simplicio-cli`). Without it, the execute
|
|
447
|
+
step is reported as `skipped` and no diff is produced — the rest of the flow
|
|
448
|
+
still runs so you can see the wiring.
|
|
449
|
+
|
|
450
|
+
**What if I have no Jira/ADO/GitHub MCP server?**
|
|
451
|
+
No problem. Transport is `auto`: it tries MCP first (when the host registers a
|
|
452
|
+
provider) and falls back to the REST API. Set the REST credentials and you're
|
|
453
|
+
fine.
|
|
454
|
+
|
|
455
|
+
**Does it ever merge or push to my main branch?**
|
|
456
|
+
No. It pushes the work to an **isolated branch** and opens a **draft PR**. You
|
|
457
|
+
review and merge. Watch mode is the same — it always stops at the draft PR.
|
|
458
|
+
|
|
459
|
+
**Will it touch files outside the task?**
|
|
460
|
+
The executor is constrained to "touch only what the task requires; keep tests
|
|
461
|
+
green". The mapper only ever writes under `.specs/`. The skill installer only
|
|
462
|
+
writes its dedicated files or a marked block in `AGENTS.md`/`GEMINI.md`.
|
|
463
|
+
|
|
464
|
+
**Is the 600-subagent fan-out required?**
|
|
465
|
+
No — it's opt-in (`--fanout`) and skips gracefully without a kernel/key. Use
|
|
466
|
+
`--fanout-dry-run` to preview cost offline.
|
|
467
|
+
|
|
468
|
+
**A reviewer left a comment — what happens?**
|
|
469
|
+
The review loop reads the actionable feedback, re-runs simplicio to address it,
|
|
470
|
+
re-collects fresh evidence, and pushes — repeating until you approve. An agent
|
|
471
|
+
subscribed to PR activity can drive this automatically.
|
|
472
|
+
|
|
473
|
+
**Where do I see what happened?**
|
|
474
|
+
In the log file (`~/.local/state/sendsprint/logs/sendsprint.log`) and the
|
|
475
|
+
archived `RunReport` JSON. Use `--log-level DEBUG` for full detail.
|
|
476
|
+
|
|
477
|
+
**How do I re-deliver a card watch already shipped?**
|
|
478
|
+
Delete its key from (or remove) `.sendsprint/runs/watch-state.json`.
|
|
479
|
+
|
|
480
|
+
## Tests
|
|
481
|
+
|
|
482
|
+
```bash
|
|
483
|
+
pip install -e ".[dev]"
|
|
484
|
+
pytest tests/ -q
|
|
485
|
+
ruff check sendsprint/ && ruff format sendsprint/
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
## License
|
|
489
|
+
|
|
490
|
+
MIT — see [LICENSE](./LICENSE).
|