@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.
Files changed (4) hide show
  1. package/AGENTS.md +95 -16
  2. package/README.md +7 -0
  3. package/package.json +1 -1
  4. 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. **Use sparingly.** Themes are
146
- years-stable strategic categories; almost every plan fits under an
147
- existing one. Only call this when the human explicitly asks for a
148
- new theme or when the work genuinely doesn't fit any of the existing
149
- ones from `list_themes`. Default rule: if you're tempted to create
150
- a theme, file a capability under the closest existing theme instead
151
- and let the human reorganize later.
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. Stop
406
- and ask the user explicitly whether this represents a new
407
- strategic direction worth a years-stable theme. Only call
408
- `propose_theme` after the user confirms themes are
409
- years-stable, not per-feature.
410
- The propose_theme tool enforces this discovery: skipping
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
- Return a single JSON block. The user will paste it into Roadmapper's
431
- import or read it manually; either way the field names must match
432
- exactly. IDs use the `__NEW__` placeholder prefix when you're
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.1",
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",