@roadmapperai/mcp 0.9.1 → 0.9.4
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/AGENTS.md +95 -16
- package/README.md +7 -0
- package/package.json +1 -1
- package/server.mjs +1336 -34
package/AGENTS.md
CHANGED
|
@@ -85,6 +85,13 @@ that's almost always what you actually want.
|
|
|
85
85
|
CANDIDATE for `propose_capability` (human-confirmed) followed by
|
|
86
86
|
`move_tasks`. Tune `minClusterSize` (default 3) / `fitThreshold`
|
|
87
87
|
(default 0.2) to control sensitivity.
|
|
88
|
+
- `detect_theme_sprawl` — the theme-level companion. Scores every
|
|
89
|
+
active theme against every other and flags pairs that overlap enough
|
|
90
|
+
to be consolidation candidates, each with a suggested merge
|
|
91
|
+
(`move_capabilities` the lighter theme's bets into the heavier, then
|
|
92
|
+
`archive_theme`). This is how you keep theme count in check now that
|
|
93
|
+
agents create themes autonomously (see `propose_theme`). Run it at
|
|
94
|
+
quarterly review. Tune `threshold` (default 0.34).
|
|
88
95
|
- `get_agents_md` — re-read this contract on demand.
|
|
89
96
|
|
|
90
97
|
**Multi-workspace addressing.** A single MCP install can talk to any
|
|
@@ -137,18 +144,37 @@ to "tell the human what I'd do"):
|
|
|
137
144
|
succeeds (this is a nudge, not a gate — unlike `propose_capability`,
|
|
138
145
|
which hard-blocks until you've done discovery). Surface the warning
|
|
139
146
|
to the user.
|
|
147
|
+
- `propose_tasks` — **bulk** create many tasks under ONE capability in
|
|
148
|
+
a single call. **This is the token-efficient path: prefer it over N
|
|
149
|
+
separate `propose_task` calls when filing a plan** — one request, one
|
|
150
|
+
compact `{id,title}` array back. Each task spec needs `title` +
|
|
151
|
+
`effort`; intra-batch dependencies work by giving a task a `ref` and
|
|
152
|
+
listing that ref in a sibling's `dependsOn` (refs are rewritten to
|
|
153
|
+
real ids after minting). A validation error fails the whole batch
|
|
154
|
+
before writing; once valid, per-row RPC failures are reported in
|
|
155
|
+
`tasks[].error` without sinking the rest.
|
|
140
156
|
- `propose_capability` — create a new capability under an **existing**
|
|
141
157
|
theme. Required: `name`, `pillarId`. Sensible defaults are applied
|
|
142
158
|
(`reach: 100`, `impact: 1`, `confidence: 70`). Pass `outcome` and
|
|
143
159
|
`specRef` whenever you have them — capabilities without an outcome
|
|
144
160
|
rarely survive review. Pass `idempotencyKey`.
|
|
145
|
-
- `propose_theme` — create a new theme. **
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
161
|
+
- `propose_theme` — create a new theme. **Theme-autonomy is ON by
|
|
162
|
+
default**, so you MAY create a theme without human confirmation when
|
|
163
|
+
the work genuinely needs a new years-stable pillar. You don't police
|
|
164
|
+
sprawl by asking a human every time — the server does it for you:
|
|
165
|
+
`propose_theme` returns `error: "too_similar"` (naming the match) if
|
|
166
|
+
your theme overlaps an existing one above the block bar, so you reuse
|
|
167
|
+
or `update_theme` that one instead. Still prefer the deepest existing
|
|
168
|
+
parent (new task > new capability > new theme); a theme is the rare
|
|
169
|
+
case. If a workspace turned autonomy OFF (Settings → Agent
|
|
170
|
+
automation), `propose_theme` returns `error: "confirmation_required"`
|
|
171
|
+
until you surface the new theme to the user and retry with
|
|
172
|
+
`confirm: true`. Use `force: true` only to override a `too_similar`
|
|
173
|
+
block that's a genuine false positive. Run `detect_theme_sprawl`
|
|
174
|
+
periodically to catch themes that have drifted into overlap.
|
|
175
|
+
- `submit_acceptance_grades` — stamp `{ status: pass | fail, note? }`
|
|
176
|
+
per criterion index, after you've actually verified the work. The
|
|
177
|
+
server stamps `gradedAt` and `gradedBy: "mcp:agent"`.
|
|
152
178
|
- `submit_acceptance_grades` — stamp `{ status: pass | fail, note? }`
|
|
153
179
|
per criterion index, after you've actually verified the work. The
|
|
154
180
|
server stamps `gradedAt` and `gradedBy: "mcp:agent"`.
|
|
@@ -223,6 +249,45 @@ disagrees with the cwd snapshot are refused — set
|
|
|
223
249
|
`ROADMAPPER_ALLOW_CROSS_WORKSPACE=1` in the env to override.
|
|
224
250
|
Reads can target any workspace freely.
|
|
225
251
|
|
|
252
|
+
**Repo-link gate (write path).** If you're in a git repo that
|
|
253
|
+
isn't mapped to a workspace, a mutator would silently land on the
|
|
254
|
+
install's env-default workspace — almost never what you want. So
|
|
255
|
+
the first such write is **refused** with a structured error:
|
|
256
|
+
|
|
257
|
+
```json
|
|
258
|
+
{
|
|
259
|
+
"error": "repo_unmapped",
|
|
260
|
+
"message": "\"owner/name\" isn't mapped to a workspace ...",
|
|
261
|
+
"fix": "link_repo()",
|
|
262
|
+
"alt": "<tool>({ workspaceId: \"<target>\", ... })"
|
|
263
|
+
}
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
Resolve it one of two ways, then retry:
|
|
267
|
+
- **`link_repo()`** — maps the repo you're in to your key's
|
|
268
|
+
workspace, so every future session resolves silently. This is
|
|
269
|
+
the right move when the repo *should* feed this workspace.
|
|
270
|
+
- **Pass `workspaceId` explicitly** on the call — proceeds without
|
|
271
|
+
mapping the repo. This is the escape hatch when you're working
|
|
272
|
+
across **several repos in one session** and just want this write
|
|
273
|
+
to land on a specific existing workspace.
|
|
274
|
+
|
|
275
|
+
The gate is repo-aware and only fires for a genuinely unmapped
|
|
276
|
+
repo: an explicit `workspaceId`, an already-mapped repo (resolves
|
|
277
|
+
via `repo_workspace_map`), or not being in a git repo at all
|
|
278
|
+
pass straight through — a multi-repo chat is never bricked.
|
|
279
|
+
Operators can disable the gate entirely with
|
|
280
|
+
`ROADMAPPER_ALLOW_UNMAPPED_REPO=1`.
|
|
281
|
+
|
|
282
|
+
This gate and the **seed-workspace guard** below are complementary,
|
|
283
|
+
not redundant: the repo-link gate covers the *in a git repo but
|
|
284
|
+
unmapped* case (and gives the more actionable `link_repo` fix),
|
|
285
|
+
while the seed-workspace guard still catches a write that fell
|
|
286
|
+
through to the bundled `"default"` workspace when you're **not** in
|
|
287
|
+
any repo (nothing to link). A write can be refused by at most one of
|
|
288
|
+
them; both protect the same env-default footgun from different
|
|
289
|
+
angles.
|
|
290
|
+
|
|
226
291
|
Authoring discipline:
|
|
227
292
|
- Read first (`list_themes`, `list_capabilities`, `list_tasks`) before
|
|
228
293
|
proposing anything, so you don't invent a new theme/capability that
|
|
@@ -402,12 +467,17 @@ Before writing anything:
|
|
|
402
467
|
- **Top score 0.2–0.4**: weak overlap. The top match is still
|
|
403
468
|
usually the right home; re-using a "close-enough" theme is
|
|
404
469
|
almost always better than creating a duplicate.
|
|
405
|
-
- **Empty matches or top < 0.2**: no existing theme fits.
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
470
|
+
- **Empty matches or top < 0.2**: no existing theme fits. With
|
|
471
|
+
theme-autonomy ON (the default), you may call `propose_theme`
|
|
472
|
+
directly when this is a genuinely new years-stable pillar — you
|
|
473
|
+
don't need to stop and ask. The server is the sprawl guard: it
|
|
474
|
+
refuses a near-duplicate (`error: "too_similar"`), so a theme that
|
|
475
|
+
gets created is one that doesn't already exist. With autonomy OFF,
|
|
476
|
+
`propose_theme` returns `error: "confirmation_required"` — surface
|
|
477
|
+
the theme to the user and retry with `confirm: true`. Either way,
|
|
478
|
+
prefer a capability under the closest theme when one is even
|
|
479
|
+
plausibly a fit; a new theme is the rare case.
|
|
480
|
+
The propose_theme tool enforces discovery: skipping
|
|
411
481
|
`suggest_theme_for` (or `list_themes` / `get_roadmap_snapshot`)
|
|
412
482
|
returns a `discovery_missing` error.
|
|
413
483
|
2. **Decompose into Capabilities.** A Capability is "a quarterly
|
|
@@ -427,9 +497,18 @@ Before writing anything:
|
|
|
427
497
|
|
|
428
498
|
### What to emit (template)
|
|
429
499
|
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
500
|
+
**If the write tools are live (you can call `propose_capability` /
|
|
501
|
+
`propose_tasks`), FILE DIRECTLY — do not also emit this JSON block.**
|
|
502
|
+
Dumping the full plan as JSON *and* filing it via tools pays for the
|
|
503
|
+
plan twice in tokens, and the tools are the canonical path anyway. Use
|
|
504
|
+
`propose_capability` for the bet, then ONE `propose_tasks` call for all
|
|
505
|
+
its tasks (not N `propose_task` calls), and report back a short summary
|
|
506
|
+
with the returned ids — not the whole record set. The JSON block below
|
|
507
|
+
is only for the **no-write-tools** case (seed/live-read tier), where
|
|
508
|
+
the user pastes it into Roadmapper's import manually.
|
|
509
|
+
|
|
510
|
+
When you do emit it: return a single JSON block. The field names must
|
|
511
|
+
match exactly. IDs use the `__NEW__` placeholder prefix when you're
|
|
433
512
|
proposing a new record — Roadmapper assigns the real `TH-NNNNNN` /
|
|
434
513
|
`CAP-NNN` / `TK-NNNNNN` ID at import time.
|
|
435
514
|
|
package/README.md
CHANGED
|
@@ -134,6 +134,13 @@ the check with `ROADMAPPER_DISABLE_UPDATE_CHECK=1`.
|
|
|
134
134
|
|
|
135
135
|
### Recent changes
|
|
136
136
|
|
|
137
|
+
- **0.9.3** — new `link_repo` tool: when `get_active_workspace` reports
|
|
138
|
+
`env_default`/`unresolved` and you're in a git repo, one call persists
|
|
139
|
+
the repo → workspace mapping so future sessions resolve silently (the
|
|
140
|
+
repo slug is derived server-side; your API key pins the workspace).
|
|
141
|
+
- **0.9.2** — `get_active_workspace` returns an explicit status envelope
|
|
142
|
+
(`resolved` / `ambiguous` / `env_default` / `unresolved`) with a `next`
|
|
143
|
+
action, instead of prose; surfaces multi-repo ambiguity.
|
|
137
144
|
- **0.9.1** — the server now self-reports its real version (was a stale
|
|
138
145
|
hardcoded string in `serverInfo` and audit logs) and warns at boot
|
|
139
146
|
when a newer package is published.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@roadmapperai/mcp",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.4",
|
|
4
4
|
"description": "Roadmapper AI MCP server — exposes a planning surface (themes, capabilities, tasks, sprints, PRs) to coding agents via stdio JSON-RPC. Pairs with the Roadmapper AI workspace at dashboard.roadmapperai.com.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mcp",
|