sprinty-mcp 0.1.8 → 0.1.10

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.
package/README.md CHANGED
@@ -1,44 +1,46 @@
1
- # sprinty
1
+ # Sprinty
2
2
 
3
- A disciplined-sprint MCP server for AI coding agents — **Claude Code, Codex, and Gemini**.
3
+ Disciplined sprint tracking for AI coding agents.
4
4
 
5
- Sprinty gives an agent first-class tools to run a sprint with structure that can't silently rot:
6
- structured **sprint subsprint item** objects, dependency edges with cycle detection, an
7
- **immutable append-only ledger** anchored to real git commits, Git-backed **change maps**, durable
8
- file **artifacts**, item-scoped **notes**, Markdown changelogs with file tables, **programmatic
9
- close-gates** that re-run your tests and require coverage evidence before a sprint can close, a
10
- bounded **regex search** over the record, and a **live follow-along dashboard**.
5
+ Sprinty is an MCP server that gives agents a structured way to plan, execute, verify, and close
6
+ non-trivial coding work. It keeps the sprint record local, append-only, and tied to real git
7
+ commits, so an agent cannot quietly lose track of work, invent ids, or mark items done without
8
+ evidence.
11
9
 
12
- The point: the agent doesn't drift, and the record doesn't lie. IDs are minted server-side, items
13
- can't exist without gates, `item_done` rejects a commit that doesn't exist or lacks a semver
14
- changelog line, and `sprint_close` refuses to close while anything is open, coverage is missing, or
15
- a gate fails.
10
+ ## Why Use Sprinty?
16
11
 
17
- ## Install
12
+ Without Sprinty, long agent sessions often drift:
18
13
 
19
- Sprinty has two layers:
14
+ - work gets tracked in loose prose that is hard to resume;
15
+ - tasks are marked done without a real commit or passing gate evidence;
16
+ - follow-up context disappears after a restart;
17
+ - humans cannot easily see what the agent is doing right now.
20
18
 
21
- - the MCP server, which runs from npm as `npx -y sprinty-mcp`;
22
- - optional client manifests under `clients/` for agents that support plugins or extensions.
19
+ With Sprinty, the agent gets MCP tools for:
23
20
 
24
- The npm package is `sprinty-mcp`. The server, MCP tool namespace, and client manifests are named
25
- `sprinty`. The tarball ships the canonical top-level `skills/` directory; client directories in a
26
- Git checkout may symlink to it, but package consumers should treat the top-level `skills/` directory
27
- as authoritative.
21
+ - sprint, subsprint, and item tracking with server-minted ids;
22
+ - dependency edges, blocked work, and cycle detection;
23
+ - item gates that require passing evidence before completion;
24
+ - git commit validation and per-item change maps;
25
+ - notes and artifacts attached to the sprint record;
26
+ - compact `overview`, `next`, and `search` reads for agent token budgets;
27
+ - a local dashboard URL returned by `sprint_new` and `sprint_resume`;
28
+ - strict `sprint_close` checks that refuse to close while work, coverage, or gates are missing.
28
29
 
29
- ### Claude Code
30
+ ## Installation
30
31
 
31
- Add the MCP server directly:
32
+ Sprinty is published as the npm package `sprinty-mcp`.
32
33
 
33
34
  ```bash
34
- claude mcp add sprinty -- npx -y sprinty-mcp
35
+ npx -y sprinty-mcp
35
36
  ```
36
37
 
37
- The repo also includes a Claude plugin manifest in `clients/claude/`.
38
+ The server is usually launched by an MCP client. Sprinty works with any MCP client that can run a
39
+ local command.
38
40
 
39
41
  ### Codex
40
42
 
41
- Fast path: add the MCP server to `~/.codex/config.toml`:
43
+ Add Sprinty to `~/.codex/config.toml`:
42
44
 
43
45
  ```toml
44
46
  [mcp_servers.sprinty]
@@ -46,156 +48,183 @@ command = "npx"
46
48
  args = ["-y", "sprinty-mcp"]
47
49
  ```
48
50
 
49
- Sprinty does not guess from the MCP server process cwd. Start a sprint with explicit paths:
51
+ ### Claude Code
50
52
 
51
- ```json
52
- {
53
- "goal": "Build the catalogue MCP",
54
- "git_dir": "/absolute/path/to/your/repo",
55
- "data_dir": "/absolute/path/to/your/repo/.sprinty",
56
- "context_notes": ["optional context"]
57
- }
53
+ ```bash
54
+ claude mcp add sprinty -- npx -y sprinty-mcp
55
+ ```
56
+
57
+ The repository also includes a Claude plugin manifest in `clients/claude/`.
58
+
59
+ ### Gemini CLI
60
+
61
+ From a repository checkout:
62
+
63
+ ```bash
64
+ gemini extensions install ./clients/gemini
58
65
  ```
59
66
 
60
- `git_dir` is where commits, gates, coverage, and change maps run. `data_dir` is where Sprinty stores
61
- the `current` pointer and append-only JSONL ledgers. Use a worktree-scoped, uncommitted `data_dir`,
62
- such as `<git_dir>/.sprinty` when that path is gitignored; avoid shared temp dirs or any directory
63
- that will be committed. After a Codex/MCP restart, call `sprint_list(data_dir)` to inspect the
64
- existing ledgers and `sprint_resume(git_dir, data_dir)` to reattach without creating a sprint.
65
- Use `sprint_detach()` to clear a process binding before resuming another sprint. For read-only
66
- tools before `sprint_new`, you may also pre-bind the MCP server with `SPRINTY_GIT_DIR` and
67
- `SPRINTY_DATA_DIR` or `--git-dir` and `--data-dir`; both are required together.
68
- `SPRINTY_REPO_DIR` and `SPRINTY_WORKTREE` remain accepted as legacy aliases for `git_dir` only when
69
- a `data_dir` is also supplied.
67
+ The Gemini extension uses `clients/gemini/gemini-extension.json` and `clients/gemini/GEMINI.md`.
70
68
 
71
- Codex CLI plugin path: install the repo-local marketplace from a repository checkout:
69
+ ### Codex Plugin From A Checkout
70
+
71
+ For local plugin development from this repository:
72
72
 
73
73
  ```bash
74
74
  codex plugin marketplace add .
75
75
  codex plugin add sprinty@sprinty-local
76
76
  ```
77
77
 
78
- The installable plugin bundle is `plugins/sprinty/`, and the marketplace index is
79
- `.agents/plugins/marketplace.json`. This marketplace layout is for Git/repo installs, not the npm
80
- tarball. The plugin uses a `plugins/sprinty/skills` symlink to the canonical top-level `skills/`
81
- directory; there is no duplicated Codex-only skill copy.
78
+ The installable plugin bundle lives in `plugins/sprinty/`.
82
79
 
83
- After installation, ask Codex to use Sprinty for a non-trivial task. It should call `sprint_new`
84
- before implementation and `sprint_close` before claiming the sprint is done.
80
+ ## Quick Start
85
81
 
86
- ### Gemini CLI
82
+ Sprinty never guesses the repository from the MCP server process cwd. Start a sprint with explicit
83
+ paths:
87
84
 
88
- `clients/gemini/` is a Gemini extension (`gemini-extension.json` + `GEMINI.md` + skills):
85
+ ```json
86
+ {
87
+ "goal": "Ship the dashboard lifecycle change",
88
+ "git_dir": "/absolute/path/to/repo",
89
+ "data_dir": "/absolute/path/to/repo/.sprinty",
90
+ "context_notes": ["optional notes for the agent"]
91
+ }
92
+ ```
93
+
94
+ - `git_dir` is where Sprinty checks commits, runs gates, reads coverage, and builds change maps.
95
+ - `data_dir` is where Sprinty stores the `current` pointer and JSONL ledgers.
96
+ - Use a worktree-scoped, gitignored `data_dir`, such as `<git_dir>/.sprinty`.
97
+
98
+ After a restart, inspect and resume the same sprint:
99
+
100
+ ```text
101
+ sprint_list({ data_dir })
102
+ sprint_resume({ git_dir, data_dir })
103
+ ```
104
+
105
+ You can also pre-bind a read-only MCP process with both environment variables:
89
106
 
90
107
  ```bash
91
- gemini extensions install ./clients/gemini
108
+ SPRINTY_GIT_DIR=/absolute/path/to/repo
109
+ SPRINTY_DATA_DIR=/absolute/path/to/repo/.sprinty
92
110
  ```
93
111
 
94
- The skill guidance is authored once in `skills/`. Client packages should reference or symlink that
95
- content rather than copying it.
112
+ Both `SPRINTY_GIT_DIR` and `SPRINTY_DATA_DIR` are required together.
96
113
 
97
- ## The loop
114
+ ## Basic Workflow
98
115
 
116
+ ```text
117
+ sprint_new({ goal, git_dir, data_dir, context_notes? })
118
+ -> returns dashboard.url
119
+ overview({})
120
+ subsprint_new({ description, goals, gates, dependencies? })
121
+ item_add({ subsprint, title, description, code_locations, gates, dependencies?, high_priority? })
122
+ next({})
123
+ item_done({ id, commit_id, gate_results, changelog })
124
+ changelog({})
125
+ sprint_close({ coverage: { path, format: "lcov", command? } })
99
126
  ```
100
- sprint_list(data_dir?) -> sprint_resume(git_dir, data_dir) | sprint_detach()
101
- sprint_new(goal, git_dir, data_dir, context_notes?)
102
- -> dashboard URL in response | dashboard_info() | dashboard_restart()
103
- -> overview() | next() | search(pattern, context_size?)
104
- -> subsprint_new(description, goals[], gates[], dependencies?)
105
- -> subsprint_list() | subsprint_get(id)
106
- -> item_add(subsprint, title, description, code_locations[], gates[], dependencies?, high_priority?)
107
- -> item_update(id, note?, title?, description?, high_priority?, dependencies?)
108
- -> note_add(id, text) | note_list(id) | note_get(id) | note_update(id, text)
109
- -> artifact_add(title, path, description?, related_items?) | artifact_list() | artifact_get(id) | artifact_update(id, ...)
110
- -> item_done(id, commit_id, gate_results[], changelog) | item_split(id, ...) | item_deprecate(id, reason)
111
- -> changelog()
112
- -> sprint_close(coverage: { path, format: "lcov", command? })
127
+
128
+ Use `item_split` when an item is too large and `item_deprecate` when an item is intentionally
129
+ dropped. Use `sprint_detach` before switching one MCP process to a different sprint.
130
+
131
+ ## Dashboard
132
+
133
+ `sprint_new` and `sprint_resume` automatically start a read-only local dashboard and return:
134
+
135
+ ```json
136
+ {
137
+ "dashboard": {
138
+ "running": true,
139
+ "url": "http://127.0.0.1:60767",
140
+ "port": 60767
141
+ }
142
+ }
113
143
  ```
114
144
 
115
- Full tool reference: [`skills/using-sprinty/SKILL.md`](skills/using-sprinty/SKILL.md).
116
- How to run a sprint: [`skills/how-to-run-a-sprint/SKILL.md`](skills/how-to-run-a-sprint/SKILL.md).
117
-
118
- ## Watching the Dashboard
119
-
120
- The dashboard is for the human sitting next to the agent.
121
-
122
- 1. Start or resume the sprint with `sprint_new()` or `sprint_resume()`.
123
- 2. Open the returned dashboard `http://127.0.0.1:<port>` URL in a browser.
124
- 3. Leave it open while the sprint runs; it refreshes every two seconds.
125
-
126
- Agents should show the dashboard URL returned by `sprint_new()` or `sprint_resume()` to the human. Use
127
- `dashboard_info()` to re-read the current URL and `dashboard_restart()` to restart the server. The
128
- dashboard shows the sprint goal, explicit git/data paths, branch/worktree, artifact shelf, sprint progress, item status
129
- distribution, code churn, subsprint progress, open items, gate evidence, dependency graph state,
130
- commit ids and changelog lines for completed items, changed-file hotspots, and a paginated ledger
131
- from the immutable timeline.
132
-
133
- The dashboard server binds to `127.0.0.1` on an ephemeral port and is read-only. It lives only for
134
- the running MCP server process, and a successful `sprint_close()` or `sprint_archive()` stops that
135
- dashboard URL so old sprint dashboards do not pile up.
136
-
137
- ## Proof Model
138
-
139
- Sprinty records timestamps on every event and projects them into the sprint timeline. Completed
140
- items require a real git commit id and controlled changelog entry when `item_done()` is called, and
141
- `sprint_close()` checks that the commit still resolves before closing. `item_done()` also records a
142
- Git-backed change map for the commit: file, language, directory, additions, deletions, net change,
143
- churn, item ids, and commit ids. `changelog()` renders a Markdown release note with semver sections,
144
- coverage, and change-map tables. `item_done()` also requires passing evidence for every declared
145
- item gate, including manual gates. When an early declared gate was a placeholder, `item_done()` can
146
- record an explicit supersession: the final passing gate result names the declared gate in
147
- `supersedes` and includes a `supersession_reason`, preserving strict evidence without pretending
148
- the placeholder command was the final proof. Dependencies are stored as ids and replaced with
149
- `item_update({ id, dependencies })`; pass `dependencies: []` to remove a bad edge. Writes reject
150
- unknown ids, duplicates, and cycles. Use `next()` for the active work window and `subsprint_get({
151
- id })` or `item_get({ id })` for focused detail.
152
- At close, executable gates are re-run by Sprinty and `sprint_close()` requires an LCOV coverage
153
- report path.
154
-
155
- Artifacts are append-only too: updates are separate ledger events, never in-place silent edits.
156
- Public artifact tools expose file paths and optional related item ids. Notes are first-class records
157
- with ids like `N001`, but they must attach to a specific item id; they are not a planning surface.
158
-
159
- Items have two text fields by design: `title` is a short one-line label for the tree/dashboard, and
160
- `description` is bounded detail for the expanded item body. `high_priority` is a simple boolean
161
- that promotes available work in `next()`; it is not a ranking system. Use one item per independently
162
- verifiable behavior, tool, endpoint, component, or migration step. If an item needs a list of
163
- unrelated deliverables in the title, split it before adding it. Oversized `item_add()` calls return
164
- a validation nudge to create more than one smaller item. Notes must attach to a specific item id and
165
- must not be used as a substitute for trackable items.
166
-
167
- ## Response Budgets
168
-
169
- Sprinty tools are designed for agent token budgets:
170
-
171
- - `overview()` is compact: sprint title/details, compact notes/artifacts, and subsprint counts only.
172
- Use `subsprint_get({ id })` for item rows.
173
- - `next()` is the active work window and deliberately omits the full dependency graph. By default it
174
- returns one resolved item, all available high-priority items, then one normal available item per
175
- subsprint; tune that with `past`, `future_per_subsprint`, and `include_high_priority`.
176
- - `search({ pattern, context_size })` uses JavaScript regex syntax and returns compact rows with
177
- `{ id, type, text, tool_call }`.
178
- - list tools are compact and point to the matching `_get()` tool for full untruncated detail.
179
- - tool responses omit timestamps and empty fields; the ledger and dashboard keep audit detail.
180
-
181
- The repository includes hard response-size and speed gates against a hermetic Capsem-shaped fixture.
182
- The steady-state read-handler p95 cap is 2ms.
183
-
184
- ## Storage
185
-
186
- One append-only JSONL ledger file per sprint under the explicit `data_dir`, with a `current` pointer
187
- naming the active sprint (this enforces one-open-sprint unicity for that binding). `git_dir` and
188
- `data_dir` are intentionally separate so agents can run gates against one checkout while storing
189
- Sprinty state somewhere deliberate. It is local state — keep it gitignored when `data_dir` lives
190
- inside a repository, and scope it to the active worktree or repo instead of a shared process temp
191
- directory.
192
-
193
- ## Develop
145
+ Open the URL in a browser to watch progress while the agent works. The dashboard shows sprint
146
+ status, items, blocked work, gates, artifacts, changelog entries, change maps, and the ledger.
147
+
148
+ Dashboard tools:
149
+
150
+ - `dashboard_info` returns the current dashboard URL and port without restarting it.
151
+ - `dashboard_restart` restarts the dashboard server and returns the new URL and port.
152
+ - `sprint_close`, `sprint_archive`, and `sprint_detach` stop the dashboard.
153
+
154
+ ## Available Tools
155
+
156
+ ### Sprint Tools
157
+
158
+ | Tool | What it does |
159
+ | --- | --- |
160
+ | `sprint_new` | Start a sprint with explicit `git_dir` and `data_dir`; returns orientation and dashboard info. |
161
+ | `sprint_resume` | Reattach to an existing sprint after an MCP restart; returns dashboard info. |
162
+ | `sprint_list` | List ledgers in a `data_dir` without creating a sprint. |
163
+ | `sprint_detach` | Clear this MCP process binding and stop the dashboard. |
164
+ | `sprint_close` | Re-run gates, require coverage evidence, and close only when all work is resolved. |
165
+ | `sprint_archive` | Archive an active sprint with a recovery reason. |
166
+ | `overview` | Compact sprint summary for orientation. |
167
+ | `next` | Compact active work window with available and blocked items. |
168
+ | `search` | Regex search over the immutable sprint ledger. |
169
+ | `changelog` | Render the sprint changelog and change-map summary as Markdown. |
170
+
171
+ ### Work Tools
172
+
173
+ | Tool | What it does |
174
+ | --- | --- |
175
+ | `subsprint_new` | Create a feature-sized unit of work. |
176
+ | `subsprint_list` | List subsprints with compact item counts. |
177
+ | `subsprint_get` | Read one subsprint and its item rows. |
178
+ | `item_add` | Create one atomic, gated item. |
179
+ | `item_get` | Read full item detail. |
180
+ | `item_update` | Update item metadata, notes, priority, or dependency edges. |
181
+ | `item_done` | Complete an item with a real commit, passing gate evidence, and changelog line. |
182
+ | `item_split` | Resolve an oversized item by creating a new subsprint. |
183
+ | `item_deprecate` | Drop an item with an explicit reason. |
184
+
185
+ ### Notes And Artifacts
186
+
187
+ | Tool | What it does |
188
+ | --- | --- |
189
+ | `note_add` | Attach a note to an item. |
190
+ | `note_list` | List notes for an item. |
191
+ | `note_get` | Read one note. |
192
+ | `note_update` | Update one note. |
193
+ | `artifact_add` | Attach a durable file path to the sprint. |
194
+ | `artifact_list` | List active artifacts. |
195
+ | `artifact_get` | Read one artifact record. |
196
+ | `artifact_update` | Update artifact metadata. |
197
+
198
+ ### Dashboard Tools
199
+
200
+ | Tool | What it does |
201
+ | --- | --- |
202
+ | `dashboard_info` | Report whether the dashboard is running and, if so, its URL and port. |
203
+ | `dashboard_restart` | Restart the dashboard and return the new URL and port. |
204
+
205
+ ## How Sprinty Stores Data
206
+
207
+ Sprinty writes one append-only JSONL ledger per sprint under `data_dir`. The ledger is local state;
208
+ keep it out of git unless you intentionally want to preserve it elsewhere. Sprinty projects that
209
+ ledger into compact read models for agents and into the dashboard for humans.
210
+
211
+ Completed items record the commit id, gate results, changelog entry, and Git-backed file change map.
212
+ `sprint_close` re-checks commits, re-runs executable gates, requires coverage evidence, and refuses
213
+ to close while any item is still open.
214
+
215
+ ## More Documentation
216
+
217
+ - [How to run a sprint](skills/how-to-run-a-sprint/SKILL.md)
218
+ - [Full Sprinty tool contract](skills/using-sprinty/SKILL.md)
219
+ - [Codex client notes](clients/codex/README.md)
220
+ - [Gemini client notes](clients/gemini/GEMINI.md)
221
+
222
+ ## Development
194
223
 
195
224
  ```bash
196
225
  npm install
197
- npm test # builds, then runs unit + e2e tests
198
- npm run test:coverage
226
+ npm test
227
+ npm run typecheck
199
228
  npm run build
200
229
  ```
201
230
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sprinty",
3
- "version": "0.1.8",
3
+ "version": "0.1.10",
4
4
  "description": "Disciplined sprint workflow: dashboard-at-start, feature subsprints, artifacts, bug-id follow-ups, spike investigations, an immutable git-anchored ledger, and programmatic close gates.",
5
5
  "author": { "name": "Elie Bursztein" },
6
6
  "homepage": "https://github.com/ebursztein/sprinty",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sprinty",
3
- "version": "0.1.8",
3
+ "version": "0.1.10",
4
4
  "description": "Disciplined sprint workflow with dashboard-at-start, feature subsprints, artifacts, bug-id follow-ups, spike investigations, an immutable git-anchored ledger, and close gates.",
5
5
  "contextFileName": "GEMINI.md",
6
6
  "mcpServers": {