@misterhuydo/cairn-mcp 1.30.0 → 1.31.0

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
@@ -225,6 +225,32 @@ invisible:
225
225
  instead of "go and find it". A link that cannot be resolved is dropped rather than
226
226
  emitted dead.
227
227
 
228
+ The two halves answer different questions and deliberately disagree. The reader half
229
+ hides shipped and abandoned work so what is *next* leads. The JSON half publishes the
230
+ plan **complete** — `done` and `stale` phases stay in `phases` with their real status,
231
+ because a consumer that cannot see finished work will confidently render an incomplete
232
+ plan. A shipped phase also carries `shipped` (the date) and `commit` (short HEAD when it
233
+ was marked done), which is what turns "this was done" into something you can point an
234
+ agent at when you are tracing a bug back to where it came from. Phases from *superseded*
235
+ plans, whose numbers a later plan reclaimed, move to a separate `shipped_phases` array —
236
+ identity and provenance only, no `detail`, so a long-lived repo's history cannot bloat
237
+ the file. That key is always present; its absence means the file predates this.
238
+
239
+ Three rules the format leaves implicit, each of which has cost a consumer real time:
240
+
241
+ - **The `roadmap-json` block is terminated by a fence at the start of a line.** Match it
242
+ that way, not with a naive non-greedy `` ``` ``. This is safe by construction: a
243
+ newline inside a JSON string is escaped, so an embedded fence can never begin a line
244
+ and only the real terminator can.
245
+ - **`detail` may itself contain fenced code**, which is exactly why the rule above
246
+ matters. A consumer that ends the block at the first `` ``` `` it meets can end it
247
+ *inside* a JSON string and spill ~125KB of machine data onto the page as prose.
248
+ - **`cursor` may name a slice, not a top-level phase.** It is the exact focus. To mark
249
+ one phase current, use `cursor_phase`, which is always the top-level ancestor and
250
+ always resolves in `phases`; `cursor_path` is the root-to-focus chain for breadcrumbs.
251
+ All three are `null` when nothing is active, so "nothing is in progress" is never
252
+ ambiguous with a broken pointer.
253
+
228
254
  The first line is the marker that says who generated the file and when
229
255
  (`<!-- slot:roadmap format=roadmap/1 provider=cairn generated=… -->`). cairn declares
230
256
  the slot in its MCP entry in `~/.claude.json`, so a cockpit does not have to guess.