sprinty-mcp 0.1.13 → 0.1.15

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 (33) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/.claude-plugin/marketplace.json +25 -0
  3. package/README.md +59 -155
  4. package/clients/claude/.claude-plugin/plugin.json +3 -6
  5. package/clients/claude/.mcp.json +8 -0
  6. package/clients/claude/README.md +28 -0
  7. package/clients/claude/skills/how-to-run-a-sprint/SKILL.md +30 -0
  8. package/clients/claude/skills/using-sprinty/SKILL.md +62 -0
  9. package/clients/codex/README.md +21 -14
  10. package/clients/gemini/GEMINI.md +15 -18
  11. package/clients/gemini/gemini-extension.json +2 -2
  12. package/clients/gemini/skills/how-to-run-a-sprint/SKILL.md +30 -0
  13. package/clients/gemini/skills/using-sprinty/SKILL.md +62 -0
  14. package/dist/dashboard/ui/chart-windows.js +17 -9
  15. package/dist/dashboard/ui/chart-windows.js.map +1 -1
  16. package/dist/dashboard-ui/assets/{index-JnlbgBhS.js → index-BNmUzOs-.js} +12 -12
  17. package/dist/dashboard-ui/index.html +1 -1
  18. package/dist/server.js +4 -3
  19. package/dist/server.js.map +1 -1
  20. package/dist/tools/register.js +80 -23
  21. package/dist/tools/register.js.map +1 -1
  22. package/dist/tools/schemas.d.ts +14 -8
  23. package/dist/tools/schemas.js +6 -4
  24. package/dist/tools/schemas.js.map +1 -1
  25. package/docs/sprinty-dashboard.png +0 -0
  26. package/package.json +7 -5
  27. package/plugins/sprinty/.codex-plugin/plugin.json +32 -0
  28. package/plugins/sprinty/.mcp.json +6 -0
  29. package/plugins/sprinty/README.md +49 -0
  30. package/plugins/sprinty/skills/how-to-run-a-sprint/SKILL.md +30 -0
  31. package/plugins/sprinty/skills/using-sprinty/SKILL.md +62 -0
  32. package/skills/how-to-run-a-sprint/SKILL.md +2 -2
  33. package/skills/using-sprinty/SKILL.md +3 -3
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "sprinty",
3
+ "interface": {
4
+ "displayName": "Sprinty"
5
+ },
6
+ "plugins": [
7
+ {
8
+ "name": "sprinty",
9
+ "source": {
10
+ "source": "local",
11
+ "path": "./plugins/sprinty"
12
+ },
13
+ "policy": {
14
+ "installation": "AVAILABLE",
15
+ "authentication": "ON_INSTALL"
16
+ },
17
+ "category": "Developer Tools"
18
+ }
19
+ ]
20
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "sprinty",
3
+ "owner": {
4
+ "name": "Elie Bursztein",
5
+ "url": "https://github.com/ebursztein"
6
+ },
7
+ "description": "Sprinty plugins for Claude Code.",
8
+ "plugins": [
9
+ {
10
+ "name": "sprinty",
11
+ "source": "./clients/claude",
12
+ "description": "Disciplined sprint workflow with Sprinty skills and the sprinty-mcp server.",
13
+ "version": "0.1.15",
14
+ "author": {
15
+ "name": "Elie Bursztein",
16
+ "url": "https://github.com/ebursztein"
17
+ },
18
+ "homepage": "https://github.com/ebursztein/sprinty",
19
+ "repository": "https://github.com/ebursztein/sprinty",
20
+ "license": "Apache-2.0",
21
+ "category": "Developer Tools",
22
+ "tags": ["mcp", "sprint", "workflow", "dashboard"]
23
+ }
24
+ ]
25
+ }
package/README.md CHANGED
@@ -1,191 +1,115 @@
1
1
  # Sprinty
2
2
 
3
- Disciplined sprint tracking for AI coding agents.
3
+ [![npm version](https://img.shields.io/npm/v/sprinty-mcp.svg)](https://www.npmjs.com/package/sprinty-mcp)
4
4
 
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.
5
+ Sprinty is an MCP server for running disciplined coding sprints with AI agents. It gives agents
6
+ server-minted sprint, subsprint, and item IDs; explicit dependencies; gate evidence; Git-backed
7
+ change maps; SemVer changelogs; and a local dashboard so humans can watch the work while it happens.
9
8
 
10
- ## Why Use Sprinty?
9
+ ![Sprinty dashboard](/docs/sprinty-dashboard.png)
11
10
 
12
- Without Sprinty, long agent sessions often drift:
11
+ ## Install
13
12
 
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.
13
+ Sprinty is published to npm as `sprinty-mcp`. The npm package is the MCP server. Claude and Codex
14
+ plugin installs are distributed from this Git repository through each client's marketplace system.
18
15
 
19
- With Sprinty, the agent gets MCP tools for:
16
+ ### Claude Code
20
17
 
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.
18
+ MCP-only install:
29
19
 
30
- ## Installation
20
+ ```bash
21
+ claude mcp add sprinty -- npx -y sprinty-mcp
22
+ ```
31
23
 
32
- Sprinty is published as the npm package `sprinty-mcp`.
24
+ Plugin install, with Sprinty skills plus the MCP server:
33
25
 
34
26
  ```bash
35
- npx -y sprinty-mcp
27
+ claude plugin marketplace add ebursztein/sprinty
28
+ claude plugin install sprinty@sprinty
36
29
  ```
37
30
 
38
- The server is usually launched by an MCP client. Sprinty works with any MCP client that can run a
39
- local command.
31
+ The Claude marketplace manifest is `.claude-plugin/marketplace.json`; the plugin bundle is
32
+ `clients/claude/`.
40
33
 
41
34
  ### Codex
42
35
 
43
- Add Sprinty to `~/.codex/config.toml`:
44
-
45
- ```toml
46
- [mcp_servers.sprinty]
47
- command = "npx"
48
- args = ["-y", "sprinty-mcp"]
49
- ```
50
-
51
- ### Claude Code
36
+ MCP-only install:
52
37
 
53
38
  ```bash
54
- claude mcp add sprinty -- npx -y sprinty-mcp
39
+ codex mcp add sprinty -- npx -y sprinty-mcp
55
40
  ```
56
41
 
57
- The repository also includes a Claude plugin manifest in `clients/claude/`.
58
-
59
- ### Gemini CLI
60
-
61
- From a repository checkout:
42
+ Plugin install, with Sprinty skills plus the MCP server:
62
43
 
63
44
  ```bash
64
- gemini extensions install ./clients/gemini
45
+ codex plugin marketplace add ebursztein/sprinty
46
+ codex plugin add sprinty@sprinty
65
47
  ```
66
48
 
67
- The Gemini extension uses `clients/gemini/gemini-extension.json` and `clients/gemini/GEMINI.md`.
49
+ The Codex marketplace manifest is `.agents/plugins/marketplace.json`; the plugin bundle is
50
+ `plugins/sprinty/`. Codex does not currently use an OpenAI npm plugin package for this flow.
68
51
 
69
- ### Codex Plugin From A Checkout
52
+ ### Gemini CLI
70
53
 
71
- For local plugin development from this repository:
54
+ Use the MCP server directly from npm:
72
55
 
73
56
  ```bash
74
- codex plugin marketplace add .
75
- codex plugin add sprinty@sprinty-local
57
+ npx -y sprinty-mcp
76
58
  ```
77
59
 
78
- The installable plugin bundle lives in `plugins/sprinty/`.
60
+ The repository also includes a Gemini extension in `clients/gemini/` for clients that install local
61
+ Gemini extensions.
79
62
 
80
- ## Quick Start
63
+ ### Any MCP Client
81
64
 
82
- Sprinty never guesses the repository from the MCP server process cwd. Start a sprint with explicit
83
- paths:
65
+ Configure a stdio MCP server with:
84
66
 
85
67
  ```json
86
68
  {
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"]
69
+ "command": "npx",
70
+ "args": ["-y", "sprinty-mcp"]
91
71
  }
92
72
  ```
93
73
 
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:
106
-
107
- ```bash
108
- SPRINTY_GIT_DIR=/absolute/path/to/repo
109
- SPRINTY_DATA_DIR=/absolute/path/to/repo/.sprinty
110
- ```
111
-
112
- Both `SPRINTY_GIT_DIR` and `SPRINTY_DATA_DIR` are required together.
74
+ ## Use
113
75
 
114
- ## Basic Workflow
76
+ Sprinty never guesses the repository from the MCP server process cwd. Start or resume with explicit
77
+ paths:
115
78
 
116
79
  ```text
117
80
  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: { verb: "added" | "fixed" | "changed" | "removed" | "deprecated" | "security", line } })
124
- changelog({ path? }) -> { path } // generates SemVer Markdown
125
- sprint_close({ coverage: { path, format: "lcov", command? } }) // after changelog generation
126
- ```
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
- }
81
+ sprint_resume({ git_dir, data_dir })
143
82
  ```
144
83
 
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
84
+ Use a worktree-local, gitignored `data_dir`, usually `<git_dir>/.sprinty`. When `data_dir` is
85
+ omitted and `git_dir` is provided, Sprinty uses `<git_dir>/.sprinty`. `sprint_new` and
86
+ `sprint_resume` return the dashboard URL. Call `info({ git_dir })` first for startup orientation and
87
+ compact sprint rows. Use `info({ workspace_dirs: [...] })` when you need to inspect multiple Sprinty
88
+ data dirs together, then `sprint_resume({ git_dir, data_dir })`.
155
89
 
156
- ### Sprint Tools
90
+ ## Tools
157
91
 
158
- | Tool | What it does |
92
+ | Tool | Purpose |
159
93
  | --- | --- |
94
+ | `info` | Startup orientation before binding, including sprint rows, resume/create help, and dashboard state. |
160
95
  | `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. |
96
+ | `sprint_resume` | Reattach this MCP session to an existing sprint. |
163
97
  | `sprint_detach` | Clear this MCP process binding and stop the dashboard. |
164
- | `sprint_close` | After `changelog({ path? })` has generated SemVer Markdown, re-run gates, require coverage evidence, and close only when all work is resolved. |
98
+ | `sprint_close` | Close only after all work is resolved, changelog exists, gates pass, and coverage is supplied. |
165
99
  | `sprint_archive` | Archive an active sprint with a recovery reason. |
166
100
  | `overview` | Compact sprint summary for orientation. |
167
- | `next` | Compact active work window with available and blocked items. |
101
+ | `next` | Compact active work window with current, next, blocked, relations, notes, and artifacts. |
168
102
  | `search` | Regex search over the immutable sprint ledger. |
169
- | `changelog` | Generate the SemVer Markdown changelog at `path` or the sprint data dir and return only the path. |
170
-
171
- ### Work Tools
172
-
173
- | Tool | What it does |
174
- | --- | --- |
103
+ | `changelog` | Generate SemVer Markdown and return the path. |
175
104
  | `subsprint_new` | Create a feature-sized unit of work. |
176
105
  | `subsprint_list` | List subsprints with compact item counts. |
177
106
  | `subsprint_get` | Read one subsprint and its item rows. |
178
107
  | `item_add` | Create one atomic, gated item. |
179
108
  | `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 a semver changelog verb plus line. |
182
- | `item_split` | Resolve an oversized item by creating a new subsprint. |
109
+ | `item_update` | Update item metadata, priority, notes, or dependency edges. |
110
+ | `item_done` | Complete an item with a real commit, gate evidence, and changelog entry. |
111
+ | `item_split` | Resolve an oversized item by creating a seeded subsprint. |
183
112
  | `item_deprecate` | Drop an item with an explicit reason. |
184
-
185
- ### Notes And Artifacts
186
-
187
- | Tool | What it does |
188
- | --- | --- |
189
113
  | `note_add` | Attach a note to an item. |
190
114
  | `note_list` | List notes for an item. |
191
115
  | `note_get` | Read one note. |
@@ -194,41 +118,21 @@ Dashboard tools:
194
118
  | `artifact_list` | List active artifacts. |
195
119
  | `artifact_get` | Read one artifact record. |
196
120
  | `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. |
121
+ | `dashboard_info` | Report the current dashboard URL and port. |
203
122
  | `dashboard_restart` | Restart the dashboard and return the new URL and port. |
204
123
 
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
- Call `changelog({ path? })` before close to generate the SemVer Markdown file from those entries.
213
- `sprint_close` then re-checks commits, re-runs executable gates, requires coverage evidence, and
214
- refuses to close while any item is still open.
215
-
216
- ## More Documentation
124
+ ## Release
217
125
 
218
- - [How to run a sprint](skills/how-to-run-a-sprint/SKILL.md)
219
- - [Full Sprinty tool contract](skills/using-sprinty/SKILL.md)
220
- - [Codex client notes](clients/codex/README.md)
221
- - [Gemini client notes](clients/gemini/GEMINI.md)
126
+ Publishing is gated by tests. The GitHub Release workflow runs `npm ci`, `npm test`, and only then
127
+ `npm publish --access public`.
222
128
 
223
- ## Development
129
+ Local checks:
224
130
 
225
131
  ```bash
226
- npm install
227
132
  npm test
228
133
  npm run typecheck
229
- npm run build
230
134
  ```
231
135
 
232
136
  ## License
233
137
 
234
- Apache-2.0 © Elie Bursztein
138
+ Apache-2.0
@@ -1,13 +1,10 @@
1
1
  {
2
2
  "name": "sprinty",
3
- "version": "0.1.13",
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.",
3
+ "version": "0.1.15",
4
+ "description": "Disciplined sprint workflow with dashboard-at-start, feature subsprints, artifacts, an immutable git-anchored ledger, and programmatic close gates.",
5
5
  "author": { "name": "Elie Bursztein" },
6
6
  "homepage": "https://github.com/ebursztein/sprinty",
7
7
  "repository": "https://github.com/ebursztein/sprinty",
8
8
  "license": "Apache-2.0",
9
- "keywords": ["sprint", "discipline", "ledger", "mcp"],
10
- "mcpServers": {
11
- "sprinty": { "command": "npx", "args": ["-y", "sprinty-mcp"] }
12
- }
9
+ "keywords": ["sprint", "discipline", "ledger", "mcp", "dashboard"]
13
10
  }
@@ -0,0 +1,8 @@
1
+ {
2
+ "mcpServers": {
3
+ "sprinty": {
4
+ "command": "npx",
5
+ "args": ["-y", "sprinty-mcp"]
6
+ }
7
+ }
8
+ }
@@ -0,0 +1,28 @@
1
+ # Sprinty for Claude Code
2
+
3
+ Install the MCP server directly:
4
+
5
+ ```bash
6
+ claude mcp add sprinty -- npx -y sprinty-mcp
7
+ ```
8
+
9
+ Install the full plugin from the Sprinty marketplace:
10
+
11
+ ```bash
12
+ claude plugin marketplace add ebursztein/sprinty
13
+ claude plugin install sprinty@sprinty
14
+ ```
15
+
16
+ This plugin contains:
17
+
18
+ - `.claude-plugin/plugin.json`
19
+ - `.mcp.json`, which launches `npx -y sprinty-mcp`
20
+ - `skills/how-to-run-a-sprint`
21
+ - `skills/using-sprinty`
22
+
23
+ Validate before release:
24
+
25
+ ```bash
26
+ claude plugin validate clients/claude --strict
27
+ claude plugin validate . --strict
28
+ ```
@@ -0,0 +1,30 @@
1
+ ---
2
+ name: how-to-run-a-sprint
3
+ description: Use at the start of non-trivial implementation work that should be tracked in Sprinty with explicit binding, item ownership, gates, and close checks.
4
+ ---
5
+
6
+ # How To Run A Sprint
7
+
8
+ A Sprinty sprint is item-driven. Do not keep parallel prose trackers when tools are available.
9
+
10
+ ## Loop
11
+
12
+ 1. Orient before binding. Call `info({ git_dir })` for the default `<git_dir>/.sprinty` ledger directory, `info({ data_dir })` for an explicit ledger directory, or `info({ workspace_dirs: [...] })` for a compact workspace view. Resume with `sprint_resume({ git_dir, data_dir? })`. Start fresh only with `sprint_new({ goal, git_dir, data_dir?, context_notes })`.
13
+ 2. Share the dashboard URL returned by `sprint_new({})` or `sprint_resume({})`. Use `dashboard_info({})` to re-read it, `dashboard_restart({})` to refresh it, `overview({})` for compact orientation, and `next({})` for the active work window.
14
+ 3. Create feature-sized subsprints with `subsprint_new({ description, goals, gates, dependencies })`.
15
+ 4. Create atomic work with `item_add({ subsprint, title, description, code_locations, gates, dependencies, high_priority })`. If the work is too large, make more items; do not hide scope in notes.
16
+ 5. Work against one owning item. Use `item_update({ id, note })` for progress, `item_update({ id, title, description, high_priority })` for metadata, `item_update({ id, dependencies })` to replace graph edges, `note_add({ id, text })` only for item-scoped observations, and `artifact_add({ title, path, description, related_items })` for durable files.
17
+ 6. Resolve each item exactly once: `item_done({ id, commit_id, gate_results, changelog })`, `item_split({ id, description, goals, gates, dependencies })`, or `item_deprecate({ id, reason })`.
18
+ 7. Use `search({ pattern, context_size:512 })`, `*_list`, and focused `*_get` tools when you need detail.
19
+ 8. Generate the sprint changelog with `changelog({ path? })`; Sprinty writes SemVer Markdown and returns only the path.
20
+ 9. Close only after the changelog exists: `sprint_close({ coverage:{ path, format:"lcov", command } })`.
21
+
22
+ ## Rules
23
+
24
+ - Never invent ids; read minted ids from tool results.
25
+ - Use explicit `git_dir`; `data_dir` defaults to `<git_dir>/.sprinty` when omitted. Never rely on MCP cwd.
26
+ - Keep responses compact. Prefer `next`, `overview`, `search`, and list/get pairs over full views. `next({})` returns all available high-priority items, then one normal available item per subsprint by default.
27
+ - Notes must be bound to an item id. Work needs an item.
28
+ - Gates prove items. `item_done` requires a real commit and passing evidence for every declared gate.
29
+ - `item_done` records each item's SemVer changelog verb and line; `changelog({ path? })` generates the Markdown file from those entries.
30
+ - `sprint_close` is the final gate and comes after changelog generation: it rejects open items, missing commits/changelog/coverage, and failing executable gates.
@@ -0,0 +1,62 @@
1
+ ---
2
+ name: using-sprinty
3
+ description: Use when an agent needs the exact Sprinty MCP tool contract, public tool names, compact response rules, restart recovery, or note/artifact/item semantics.
4
+ ---
5
+
6
+ # Using Sprinty
7
+
8
+ Prefer compact commands first. Lists are compact and say which `_get()` tool returns full detail. Mutating tools return acknowledgements plus `help`; do not expect or request full sprint dumps from mutations.
9
+
10
+ ## Core Tools
11
+
12
+ | Tool | Input | Use |
13
+ |---|---|---|
14
+ | `info` | `{ git_dir?, data_dir?, workspace_dirs?[] }` | First-call orientation before binding. Returns startup workflow, resume/create help, dashboard state, and sprint rows with title, created time, and open/closed/blocked item counts. |
15
+ | `sprint_resume` | `{ git_dir, data_dir? }` | Rebind this MCP process to an existing sprint and return the dashboard URL. `data_dir` defaults to `<git_dir>/.sprinty`. Never call `sprint_new` as a resume trick. |
16
+ | `sprint_detach` | `{}` | Clear this process binding before resuming a different sprint. |
17
+ | `sprint_new` | `{ goal, git_dir, data_dir?, context_notes?[] }` | Start one sprint with explicit `git_dir`; `data_dir` defaults to `<git_dir>/.sprinty`. Returns the dashboard URL. |
18
+ | `overview` | `{}` | Compact sprint title/details/artifacts/subsprints/items. Use this to orient. |
19
+ | `next` | `{ past?=1, future_per_subsprint?=1, include_high_priority?=true }` | Compact active work window. Returns all available high-priority items first, then normal available items per subsprint. No full graph. |
20
+ | `search` | `{ pattern, context_size?=512 }` | Regex search. Returns `{ id, type, text, tool_call }`; use `tool_call` for full detail. |
21
+ | `dashboard_info` | `{}` | Current localhost dashboard URL and port, or `running:false` when stopped. |
22
+ | `dashboard_restart` | `{}` | Restart the dashboard server and return the new URL and port. |
23
+
24
+ ## Work Tools
25
+
26
+ | Tool | Input | Use |
27
+ |---|---|---|
28
+ | `subsprint_new` | `{ description, goals[], gates[], dependencies?[] }` | Create a feature-sized unit. |
29
+ | `subsprint_list` | `{}` | Compact subsprint rows. Use `subsprint_get({ id })` for full detail. |
30
+ | `subsprint_get` | `{ id }` | Full subsprint detail and compact item rows. |
31
+ | `item_add` | `{ subsprint, title, description, code_locations[], gates[], dependencies?[], high_priority? }` | Create an atomic item. Title 3-80 chars; description 20-500 chars. Oversized inputs mean create more than one item. |
32
+ | `item_get` | `{ id }` | Full item detail. |
33
+ | `item_update` | `{ id, note?, title?, description?, high_priority?, dependencies?[] }` | Mutate item metadata and/or replace dependency ids. Use `dependencies:[]` to remove all dependencies. |
34
+ | `item_done` | `{ id, commit_id, gate_results[], changelog }` | Complete an item. Commit must resolve; every declared gate needs passing evidence, and `changelog` supplies the SemVer verb plus line. |
35
+ | `item_split` | `{ id, description, goals[], gates[], dependencies?[] }` | Resolve an oversized item by creating a new subsprint. |
36
+ | `item_deprecate` | `{ id, reason }` | Resolve an item as intentionally dropped. |
37
+
38
+ ## Notes And Artifacts
39
+
40
+ | Tool | Input | Use |
41
+ |---|---|---|
42
+ | `note_add` | `{ id, text }` | Attach a note to an item id only. Notes do not replace items. |
43
+ | `note_list` | `{ id }` | Compact notes for an item. Use `note_get({ id:"N001" })` for full text. |
44
+ | `note_get` | `{ id }` | Full note detail. Note ids are `N001`, `N002`, ... |
45
+ | `note_update` | `{ id, text }` | Replace note text by note id. |
46
+ | `artifact_add` | `{ title, path, description?, related_items?[] }` | Attach a durable sprint file/output. |
47
+ | `artifact_list` | `{}` | Compact artifact rows. Use `artifact_get({ id })` for full detail. |
48
+ | `artifact_get` | `{ id }` | Full artifact detail including description. |
49
+ | `artifact_update` | `{ id, title?, path?, description?, related_items?[] }` | Amend artifact metadata. |
50
+
51
+ ## Close
52
+
53
+ Sprinty generates the changelog for you. First call `changelog({ path? })` to write the SemVer Markdown file with sections, item entries, commits, coverage, and change-map tables; the response returns only `{ path }`. Then call `sprint_close({ coverage:{ path, format:"lcov", command? } })`; close re-runs executable gates and refuses open items, missing commits, missing changelog entries, missing coverage, or failing gates. Use `sprint_archive({ reason })` only for recovery.
54
+
55
+ ## Rules
56
+
57
+ - Always minimize tokens: use `next`, `overview`, `*_list`, `search`, then focused `*_get`.
58
+ - Public id inputs are always named `id`.
59
+ - Notes attach only to item ids. If the note describes work, create one or more `item_add` items.
60
+ - `high_priority` is a boolean, not a ranked priority model. `next({})` promotes all available high-priority items before the per-subsprint normal window unless `include_high_priority:false`.
61
+ - Dependencies are ids. `item_update({ id, dependencies:[...] })` replaces the item's dependency set and rejects unknown ids, duplicates, and cycles.
62
+ - Tool responses omit timestamps and empty fields; the append-only ledger keeps audit data.
@@ -1,28 +1,35 @@
1
1
  # Sprinty for Codex CLI
2
2
 
3
- The supported command-line Codex plugin lives at `plugins/sprinty/`, with the repository-local
3
+ The supported command-line Codex plugin lives at `plugins/sprinty/`, with the repository
4
4
  marketplace at `.agents/plugins/marketplace.json`. This directory is documentation only.
5
5
 
6
- Install from a repository checkout:
6
+ Install from GitHub:
7
+
8
+ ```bash
9
+ codex plugin marketplace add ebursztein/sprinty
10
+ codex plugin add sprinty@sprinty
11
+ ```
12
+
13
+ Install from a local checkout:
7
14
 
8
15
  ```bash
9
16
  codex plugin marketplace add .
10
- codex plugin add sprinty@sprinty-local
17
+ codex plugin add sprinty@sprinty
11
18
  ```
12
19
 
13
20
  Then start a new Codex CLI thread so the plugin skills and MCP server are loaded.
14
21
 
15
22
  This marketplace layout is for Git/repo installs, not the npm tarball. The npm package provides the
16
- MCP server used by the plugin (`npx -y sprinty-mcp`).
23
+ MCP server used by the plugin (`npx -y sprinty-mcp`). Codex does not currently use a standalone
24
+ OpenAI npm plugin package for this flow.
17
25
 
18
26
  The installed plugin provides:
19
27
 
20
28
  - Sprinty MCP tools through `npx -y sprinty-mcp`
21
29
  - shared Sprinty skills from the canonical repository `skills/` directory
22
30
 
23
- The npm package includes the top-level `skills/` directory for MCP resource serving. Client
24
- directories may contain symlinks to that canonical directory in a Git checkout; npm tarballs do not
25
- need per-client skill copies.
31
+ The plugin bundle contains its own `skills/` directory so Git marketplace installs remain
32
+ self-contained.
26
33
 
27
34
  MCP-only setup without plugin skills:
28
35
 
@@ -32,13 +39,13 @@ codex mcp add sprinty -- npx -y sprinty-mcp
32
39
 
33
40
  Sprinty does not infer state from Codex's MCP launch cwd. Start every sprint with explicit
34
41
  `git_dir` and `data_dir`; `git_dir` is where commits, gates, coverage, and change maps run, while
35
- `data_dir` stores the `current` pointer and JSONL ledgers. After a Codex/MCP restart, call
36
- `sprint_list(data_dir)` and then `sprint_resume(git_dir, data_dir)` to reattach without creating a
37
- new sprint. Use `sprint_detach()` before switching one MCP process to another sprint. For read-only
38
- tools before `sprint_new`, you may pre-bind with both `SPRINTY_GIT_DIR` and `SPRINTY_DATA_DIR` or
39
- both `--git-dir` and `--data-dir`.
40
-
41
- Do not copy skill files into client directories; keep them in the top-level `skills/` directory.
42
+ `data_dir` stores the `current` pointer and JSONL ledgers. When `data_dir` is omitted and `git_dir`
43
+ is provided, Sprinty uses `<git_dir>/.sprinty`. Call `info({ git_dir })` first for startup
44
+ orientation and compact sprint rows, or `info({ workspace_dirs: [...] })` to inspect multiple data
45
+ dirs. Then call `sprint_resume(git_dir, data_dir?)` to reattach without creating a new sprint. Use
46
+ `sprint_detach()` before switching one MCP process to another sprint. For read-only tools before
47
+ `sprint_new`, you may pre-bind with both `SPRINTY_GIT_DIR` and `SPRINTY_DATA_DIR` or both
48
+ `--git-dir` and `--data-dir`.
42
49
 
43
50
  For human visibility during a sprint, open the dashboard URL returned by `sprint_new()` or
44
51
  `sprint_resume()` in a browser. Use `dashboard_info()` to re-read it and `dashboard_restart()` to
@@ -5,36 +5,33 @@ When a task is non-trivial, run a disciplined sprint with the sprinty MCP.
5
5
  See `skills/how-to-run-a-sprint` and `skills/using-sprinty`. The loop:
6
6
 
7
7
  ```
8
- sprint_list(data_dir?) -> sprint_resume(git_dir, data_dir) | sprint_detach()
9
- sprint_new(goal, git_dir, data_dir, context_notes?)
8
+ info(git_dir? | data_dir? | workspace_dirs?) -> sprint_resume(git_dir, data_dir?) | sprint_detach()
9
+ sprint_new(goal, git_dir, data_dir?, context_notes?)
10
10
  -> dashboard URL in response | dashboard_info() | dashboard_restart()
11
11
  -> subsprint_new(description, goals[], gates[], dependencies?)
12
- -> spike(description, goals[], gates[], dependencies?)
13
12
  -> next(past?, future_per_subsprint?, include_high_priority?)
14
- -> add(subsprint, title, description, code_locations[], gates[], dependencies?, high_priority?)
13
+ -> item_add(subsprint, title, description, code_locations[], gates[], dependencies?, high_priority?)
15
14
  -> item_update(id, note?, title?, description?, high_priority?, dependencies?)
16
- -> artifact_add/list/amend/deprecate(...)
17
- -> follow_up(target, description, bug_id|bug_ids)
18
- -> done(commit_id, gate_results[], changelog) | split(...) | deprecate(reason)
19
- -> spike_conclude(subsprint, conclusion) | spike_deprecate(subsprint, reason)
15
+ -> artifact_add/list/get/update(...)
16
+ -> item_done(id, commit_id, gate_results[], changelog) | item_split(...) | item_deprecate(reason)
20
17
  -> changelog()
21
18
  -> sprint_close(coverage: { path, format: "lcov", command? })
22
19
  ```
23
20
 
24
21
  Rules: IDs are minted by the server (`S01`, `S01-001`) — never invent them. Start with explicit
25
- absolute `git_dir` and `data_dir`; `git_dir` is where commits/gates/coverage run, and `data_dir`
26
- stores Sprinty's `current` pointer and JSONL ledgers. After a Codex/MCP restart, use
27
- `sprint_list(data_dir)` and `sprint_resume(git_dir, data_dir)` to reattach without creating a new
28
- sprint; use `sprint_detach()` before switching one MCP process to another sprint. Every item needs a
29
- description, at least one code location, and at least one gate. `done` requires a real commit,
22
+ absolute `git_dir`; `git_dir` is where commits/gates/coverage run. `data_dir` stores Sprinty's
23
+ `current` pointer and JSONL ledgers, and defaults to `<git_dir>/.sprinty` when omitted. After a
24
+ Codex/MCP restart, call `info({ git_dir })` or `info({ workspace_dirs:[...] })`, then use
25
+ `sprint_resume(git_dir, data_dir?)` to reattach without creating a new sprint; use `sprint_detach()`
26
+ before switching one MCP process to another sprint. Every item needs a
27
+ description, at least one code location, and at least one gate. `item_done` requires a real commit,
30
28
  passing evidence for every declared item gate, and a semver-style changelog line with a verb such as
31
- `added`, `fixed`, or `removed`. `split` and `deprecate` are terminal non-code exits. Each
32
- subsprint should be one feature; use `spike()` for feature investigations, then close the spike with
33
- `spike_conclude()` or `spike_deprecate()`. Use `artifact_add/list/amend/deprecate` for durable
34
- outputs and `follow_up()` with bug ids for bugs found while moving fast. `next()` returns the active
29
+ `added`, `fixed`, or `removed`. `item_split` and `item_deprecate` are terminal non-code exits. Each
30
+ subsprint should be one feature. Use `artifact_add/list/get/update` for durable
31
+ outputs. `next()` returns the active
35
32
  work window with relevant artifacts and recent activity: all available `high_priority` items first
36
33
  by default, then normal available items per subsprint. `item_update({ id, dependencies })` replaces
37
- dependencies, so pass `dependencies: []` to remove a bad edge. `done` records a Git-backed change map and each item's SemVer changelog entry. `changelog({ path? })` generates the SemVer Markdown file with
34
+ dependencies, so pass `dependencies: []` to remove a bad edge. `item_done` records a Git-backed change map and each item's SemVer changelog entry. `changelog({ path? })` generates the SemVer Markdown file with
38
35
  sections, item entries, commits, coverage, and change-map tables; run it before `sprint_close`. `sprint_close` rechecks commits, re-runs executable gates, requires
39
36
  an LCOV coverage report path, and refuses to close on any blocker. Use `search(pattern,
40
37
  context_lines)` to query the immutable ledger. Show the dashboard URL returned by `sprint_new()` or
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "sprinty",
3
- "version": "0.1.13",
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.",
3
+ "version": "0.1.15",
4
+ "description": "Disciplined sprint workflow with dashboard-at-start, feature subsprints, artifacts, an immutable git-anchored ledger, and close gates.",
5
5
  "contextFileName": "GEMINI.md",
6
6
  "mcpServers": {
7
7
  "sprinty": { "command": "npx", "args": ["-y", "sprinty-mcp"] }