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.
Files changed (48) hide show
  1. simplicio_sprint-1.0.0/.gitignore +60 -0
  2. simplicio_sprint-1.0.0/CHANGELOG.md +60 -0
  3. simplicio_sprint-1.0.0/LICENSE +21 -0
  4. simplicio_sprint-1.0.0/PKG-INFO +490 -0
  5. simplicio_sprint-1.0.0/README.md +436 -0
  6. simplicio_sprint-1.0.0/README.pt-BR.md +436 -0
  7. simplicio_sprint-1.0.0/docs/presentations/README.md +23 -0
  8. simplicio_sprint-1.0.0/pyproject.toml +76 -0
  9. simplicio_sprint-1.0.0/sendsprint/__init__.py +10 -0
  10. simplicio_sprint-1.0.0/sendsprint/bootstrap.py +170 -0
  11. simplicio_sprint-1.0.0/sendsprint/cli.py +333 -0
  12. simplicio_sprint-1.0.0/sendsprint/credentials.py +132 -0
  13. simplicio_sprint-1.0.0/sendsprint/delivery/__init__.py +20 -0
  14. simplicio_sprint-1.0.0/sendsprint/delivery/evidence.py +138 -0
  15. simplicio_sprint-1.0.0/sendsprint/delivery/git_ops.py +84 -0
  16. simplicio_sprint-1.0.0/sendsprint/delivery/pr.py +187 -0
  17. simplicio_sprint-1.0.0/sendsprint/delivery/worktree.py +74 -0
  18. simplicio_sprint-1.0.0/sendsprint/executor/__init__.py +23 -0
  19. simplicio_sprint-1.0.0/sendsprint/executor/simplicio.py +247 -0
  20. simplicio_sprint-1.0.0/sendsprint/flow.py +419 -0
  21. simplicio_sprint-1.0.0/sendsprint/github_integration.py +360 -0
  22. simplicio_sprint-1.0.0/sendsprint/installer.py +143 -0
  23. simplicio_sprint-1.0.0/sendsprint/llm/__init__.py +5 -0
  24. simplicio_sprint-1.0.0/sendsprint/llm/client.py +175 -0
  25. simplicio_sprint-1.0.0/sendsprint/logging_setup.py +87 -0
  26. simplicio_sprint-1.0.0/sendsprint/mapper/__init__.py +15 -0
  27. simplicio_sprint-1.0.0/sendsprint/mapper/adapter.py +283 -0
  28. simplicio_sprint-1.0.0/sendsprint/models/__init__.py +59 -0
  29. simplicio_sprint-1.0.0/sendsprint/models/reports.py +89 -0
  30. simplicio_sprint-1.0.0/sendsprint/models/sprint.py +116 -0
  31. simplicio_sprint-1.0.0/sendsprint/models/workspace.py +92 -0
  32. simplicio_sprint-1.0.0/sendsprint/operators/__init__.py +15 -0
  33. simplicio_sprint-1.0.0/sendsprint/operators/_mcp_bridge.py +79 -0
  34. simplicio_sprint-1.0.0/sendsprint/operators/azure_devops_operator.py +261 -0
  35. simplicio_sprint-1.0.0/sendsprint/operators/base.py +86 -0
  36. simplicio_sprint-1.0.0/sendsprint/operators/github_issues_operator.py +186 -0
  37. simplicio_sprint-1.0.0/sendsprint/operators/jira_operator.py +274 -0
  38. simplicio_sprint-1.0.0/sendsprint/profile.py +138 -0
  39. simplicio_sprint-1.0.0/sendsprint/prompt/__init__.py +14 -0
  40. simplicio_sprint-1.0.0/sendsprint/prompt/fanout.py +182 -0
  41. simplicio_sprint-1.0.0/sendsprint/scope.py +97 -0
  42. simplicio_sprint-1.0.0/sendsprint/tech/__init__.py +5 -0
  43. simplicio_sprint-1.0.0/sendsprint/tech/detector.py +288 -0
  44. simplicio_sprint-1.0.0/sendsprint/watch.py +94 -0
  45. simplicio_sprint-1.0.0/sendsprint/workspace/__init__.py +5 -0
  46. simplicio_sprint-1.0.0/sendsprint/workspace/loader.py +69 -0
  47. simplicio_sprint-1.0.0/skills/claude/SKILL.md +79 -0
  48. 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
+ ![SendSprint frontend delivery evidence](./docs/assets/sendsprint-frontend-demo.png)
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
+ ![homepage](https://raw.githubusercontent.com/acme/web/feature/web-7/.sendsprint/evidence/WEB-7/screen.png)
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).