@starlove/orbit 1.1.1 → 1.1.11

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 (103) hide show
  1. package/.dockerignore +0 -0
  2. package/Dockerfile +0 -0
  3. package/LICENSE +0 -0
  4. package/README.md +2 -2
  5. package/SKILL-ORBIT.md +2 -0
  6. package/build.mjs +0 -0
  7. package/dist/full/apple-touch-icon.png +0 -0
  8. package/dist/full/cursors/live_arrow.cur +0 -0
  9. package/dist/full/cursors/live_link.cur +0 -0
  10. package/dist/full/cursors/live_move.cur +0 -0
  11. package/dist/full/cursors/live_select.cur +0 -0
  12. package/dist/full/cursors/live_unavail.cur +0 -0
  13. package/dist/full/favicon-32x32.png +0 -0
  14. package/dist/full/index.html +160 -15
  15. package/dist/full/js/app.55b38e12.js +698 -0
  16. package/dist/full/js/app.55b38e12.js.map +7 -0
  17. package/dist/full/orbits-favicon.png +0 -0
  18. package/dist/full/orbits-logo-bg.png +0 -0
  19. package/dist/full/orbits-logo.png +0 -0
  20. package/dist/full/{styles.836872e7.css → styles.273fc37a.css} +79 -39
  21. package/dist/full/version.json +2 -2
  22. package/docs/AGENT_PROTOCOL.md +22 -6
  23. package/docs/MCP_SETUP.md +0 -0
  24. package/docs/ORBIT_DISPATCH.md +68 -8
  25. package/docs/SS-Orbit-Dark.png +0 -0
  26. package/docs/SS-Orbit-Light.png +0 -0
  27. package/docs/mcp-client.example.json +0 -0
  28. package/docs/setup/orbit-init-wizard.md +0 -0
  29. package/package.json +1 -1
  30. package/public/apple-touch-icon.png +0 -0
  31. package/public/cursors/live_arrow.cur +0 -0
  32. package/public/cursors/live_link.cur +0 -0
  33. package/public/cursors/live_move.cur +0 -0
  34. package/public/cursors/live_select.cur +0 -0
  35. package/public/cursors/live_unavail.cur +0 -0
  36. package/public/favicon-32x32.png +0 -0
  37. package/public/index.html +158 -13
  38. package/public/js/actor-labels.js +0 -0
  39. package/public/js/api.js +0 -0
  40. package/public/js/app.js +0 -0
  41. package/public/js/board-menu.js +0 -0
  42. package/public/js/card-actions.js +19 -0
  43. package/public/js/config.js +0 -0
  44. package/public/js/create-card.js +0 -0
  45. package/public/js/dom.js +0 -0
  46. package/public/js/drawer.js +17 -43
  47. package/public/js/format.js +5 -5
  48. package/public/js/kanban.js +157 -92
  49. package/public/js/local-backend.js +15 -4
  50. package/public/js/main.js +2 -1
  51. package/public/js/modal.js +0 -0
  52. package/public/js/motion-preference.js +14 -3
  53. package/public/js/router.js +0 -0
  54. package/public/js/search.js +0 -0
  55. package/public/js/settings-tabs.js +0 -0
  56. package/public/js/settings.js +131 -27
  57. package/public/js/sse.js +0 -0
  58. package/public/js/starscape.js +0 -0
  59. package/public/js/state.js +0 -0
  60. package/public/js/theme-preference.js +0 -0
  61. package/public/js/ticket-detail.js +88 -20
  62. package/public/js/toast.js +0 -0
  63. package/public/js/transport.js +0 -0
  64. package/public/js/unread.js +0 -0
  65. package/public/js/url-routes.js +0 -0
  66. package/public/orbits-favicon.png +0 -0
  67. package/public/orbits-logo-bg.png +0 -0
  68. package/public/orbits-logo.png +0 -0
  69. package/public/styles.css +79 -39
  70. package/src/cli/orbit.js +22 -0
  71. package/src/core/agent.js +25 -4
  72. package/src/core/agents-md.js +0 -0
  73. package/src/core/attachments.js +0 -0
  74. package/src/core/auth.js +0 -0
  75. package/src/core/backups.js +0 -0
  76. package/src/core/board.js +2 -1
  77. package/src/core/boards.js +0 -0
  78. package/src/core/bootstrap.js +0 -0
  79. package/src/core/db.js +19 -0
  80. package/src/core/delete-board.js +0 -0
  81. package/src/core/dispatch.js +178 -13
  82. package/src/core/events.js +0 -0
  83. package/src/core/http.js +0 -0
  84. package/src/core/migrate.js +0 -0
  85. package/src/core/paths.js +0 -0
  86. package/src/core/provision-repo-board.js +0 -0
  87. package/src/core/queries.js +0 -0
  88. package/src/core/registry.js +2 -2
  89. package/src/core/relations.js +0 -0
  90. package/src/core/review-verdicts.js +138 -0
  91. package/src/core/router.js +38 -3
  92. package/src/core/search.js +0 -0
  93. package/src/core/seed.js +0 -0
  94. package/src/core/snapshots.js +429 -9
  95. package/src/core/states.js +0 -0
  96. package/src/core/system-picker.js +0 -0
  97. package/src/core/tickets.js +0 -0
  98. package/src/core/util.js +0 -0
  99. package/src/mcp/orbit-client.js +47 -19
  100. package/src/mcp-server.js +122 -26
  101. package/src/server.js +0 -0
  102. package/dist/full/js/app.a4f045fc.js +0 -676
  103. package/dist/full/js/app.a4f045fc.js.map +0 -7
package/src/mcp-server.js CHANGED
@@ -142,8 +142,10 @@ function createBoardAtRoot(root) {
142
142
  if (fresh) { syncRegistryFromBoardDb(fresh, db); setSessionBoard(fresh); }
143
143
  }
144
144
 
145
- initMcpSessionBoard();
146
- closeAllConnections();
145
+ if (orbitClient.mode !== "remote") {
146
+ initMcpSessionBoard();
147
+ closeAllConnections();
148
+ }
147
149
 
148
150
  /** Build a ctx for the session board (or a board the tool argument selected). */
149
151
  function ctxFor(boardRow, actor) {
@@ -185,7 +187,7 @@ const TOOL_DEFS = [
185
187
  {
186
188
  name: "board_context",
187
189
  description:
188
- "Board context pack: name, agent_instructions, journal entries (board_entries), deployment paths. Resolves board from board_id / board_slug / board, else the MCP session board. Set include_struck true to include struck journal rows (default false). Same payload as GET /api/boards/:id/context.",
190
+ "Board/project context pack: board metadata, agent_instructions, journal entries (board_entries), and deployment paths. Complements the lean board_get_ticket_context. Resolves board from board_id / board_slug / board first; the MCP session board is only a fallback convenience. Set include_struck true to include struck journal rows (default false). Same payload as GET /api/boards/:id/context.",
189
191
  inputSchema: {
190
192
  type: "object",
191
193
  properties: {
@@ -212,7 +214,7 @@ const TOOL_DEFS = [
212
214
  {
213
215
  name: "board_set_active",
214
216
  description:
215
- "Switch the MCP session to another board by slug (updates last_active_at for multi-board repos). Subsequent tools use that board until switched again.",
217
+ "Switch the MCP session fallback to another board by slug (updates last_active_at for multi-board repos). Tools that accept board_id / board_slug / board use those explicit selectors first; this session board is only the convenience fallback when selectors are omitted.",
216
218
  inputSchema: {
217
219
  type: "object",
218
220
  properties: {
@@ -226,7 +228,7 @@ const TOOL_DEFS = [
226
228
  {
227
229
  name: "board_claim_next",
228
230
  description:
229
- "Claim the next schedulable AI-ready ticket on the session's active board. Pass `board` (slug) only to explicitly switch to another board you mean to work on; omitted `board` never scans other boards.",
231
+ "Claim the next schedulable AI-ready ticket on a specific board. Resolves board from board_id / board_slug / board first; the MCP session board is only a fallback convenience when selectors are omitted, and omitted selectors never scan other boards.",
230
232
  inputSchema: {
231
233
  type: "object",
232
234
  properties: {
@@ -243,7 +245,7 @@ const TOOL_DEFS = [
243
245
  {
244
246
  name: "board_get_ticket_context",
245
247
  description:
246
- "Read the default agent context pack for a ticket, including board agent_instructions (project-level agent context), relations, blockers, implementation fields, and child cards. Ticket comments are intentionally omitted; use board_read_comments for explicit comment retrieval.",
248
+ "Return the default lean context pack for a ticket: ticket fields, board identity only, relations, blockers, parent/children, and related ticket summaries. Resolves board from board_id / board_slug / board first; the MCP session board is only a fallback convenience. Project manual/journal and comments are intentionally omitted; use board_context for board manual/journal and board_read_comments for comment threads.",
247
249
  inputSchema: {
248
250
  type: "object",
249
251
  properties: {
@@ -261,10 +263,31 @@ const TOOL_DEFS = [
261
263
  },
262
264
  handler: (args) => orbitClient.getTicketContext(args)
263
265
  },
266
+ {
267
+ name: "board_get_ticket_context_full",
268
+ description:
269
+ "Return the explicit heavy ticket context pack, preserving the historical board_get_ticket_context shape: ticket, full board row, board_manual/journal, relations, blockers, parent/children, and related tickets. Resolves board from board_id / board_slug / board first; the MCP session board is only a fallback convenience. Comments are still intentionally omitted; use board_read_comments for comment threads.",
270
+ inputSchema: {
271
+ type: "object",
272
+ properties: {
273
+ ticket_id: { type: "string" },
274
+ board_id: { type: "string" },
275
+ board_slug: { type: "string" },
276
+ board: { type: "string" },
277
+ depth: { type: "integer", minimum: 1, maximum: 3 },
278
+ max_chars_per_field: { type: "integer", minimum: 1 },
279
+ include_parent_full: { type: "boolean" },
280
+ include_related_full: { type: "boolean" }
281
+ },
282
+ required: ["ticket_id"],
283
+ additionalProperties: false
284
+ },
285
+ handler: (args) => orbitClient.getTicketContextFull(args)
286
+ },
264
287
  {
265
288
  name: "board_get_agent_dispatch_packet",
266
289
  description:
267
- "Return a lean agent dispatch packet for one ticket: board identity/instructions, capped ticket description/acceptance/AI plan, blockers, shallow parent, relevant workflow state IDs, repo path/default branch, recent capped comments, and label names. Parent/related/implementation bodies are intentionally omitted.",
290
+ "Return a lean agent dispatch packet for one ticket: board identity/instructions, capped ticket description/acceptance/AI plan, blockers, shallow parent, relevant workflow state IDs, repo path/default branch, recent capped comments, and label names. Resolves board from board_id / board_slug / board first; the MCP session board is only a fallback convenience. Parent/related/implementation bodies are intentionally omitted.",
268
291
  inputSchema: {
269
292
  type: "object",
270
293
  properties: {
@@ -283,7 +306,7 @@ const TOOL_DEFS = [
283
306
  {
284
307
  name: "board_read_ticket",
285
308
  description:
286
- "Look up a ticket by ticket_id, number, or exact title (case-insensitive) on the session's active board, and return its title, description, labels, state, and the board manual (agent_instructions + journal + deployment paths). Ticket comments are intentionally omitted; use board_read_comments for explicit comment retrieval.",
309
+ "Look up a ticket by ticket_id, number, or exact title (case-insensitive), and return its title, description, labels, state, and the board manual (agent_instructions + journal + deployment paths). Resolves board from board_id / board_slug / board first; the MCP session board is only a fallback convenience. Ticket comments are intentionally omitted; use board_read_comments for explicit comment retrieval.",
287
310
  inputSchema: {
288
311
  type: "object",
289
312
  properties: {
@@ -301,7 +324,7 @@ const TOOL_DEFS = [
301
324
  {
302
325
  name: "board_read_comments",
303
326
  description:
304
- "Return every comment on a ticket (oldest → newest). Look up by ticket_id, number, or exact title (case-insensitive) on the session's active board. Comment kinds include human_comment, agent_note, checkpoint, completion, note.",
327
+ "Return every comment on a ticket (oldest → newest). Look up by ticket_id, number, or exact title (case-insensitive). Resolves board from board_id / board_slug / board first; the MCP session board is only a fallback convenience. Comment kinds include human_comment, agent_note, checkpoint, completion, note.",
305
328
  inputSchema: {
306
329
  type: "object",
307
330
  properties: {
@@ -318,7 +341,7 @@ const TOOL_DEFS = [
318
341
  },
319
342
  {
320
343
  name: "board_get_ticket_relations",
321
- description: "List every link touching a ticket. Each entry has `type`, `direction`, `other_ticket`, and `source`. `source='relation'` rows come from the relations table (`relates_to` / `blocks` / `blocked_by`) and are the SSOT for peer dependencies — write via `POST /api/relations`, delete via `DELETE /api/relations/:id`. `source='hierarchy'` rows are read-only synthetic entries surfacing epic ownership (`child_of` toward the parent epic, `parent_of` toward each child); they have `id: null` and are mutated by patching the ticket's `parent_ticket_id`, not by calling the relations endpoints.",
344
+ description: "List every link touching a ticket. Resolves board from board_id / board_slug / board first; the MCP session board is only a fallback convenience. Each entry has `type`, `direction`, `other_ticket`, and `source`. `source='relation'` rows come from the relations table (`relates_to` / `blocks` / `blocked_by`) and are the SSOT for peer dependencies — write via `POST /api/relations`, delete via `DELETE /api/relations/:id`. `source='hierarchy'` rows are read-only synthetic entries surfacing epic ownership (`child_of` toward the parent epic, `parent_of` toward each child); they have `id: null` and are mutated by patching the ticket's `parent_ticket_id`, not by calling the relations endpoints.",
322
345
  inputSchema: {
323
346
  type: "object",
324
347
  properties: {
@@ -334,7 +357,7 @@ const TOOL_DEFS = [
334
357
  },
335
358
  {
336
359
  name: "board_get_ticket_blockers",
337
- description: "Return unresolved blockers for a ticket and a can_start boolean. The single source of truth for dependencies is the per-card `blocked_by` row in the relations table; if a row exists the blocker is unresolved. Rows are removed two ways: (1) automatically when the blocking ticket moves into the Done lane (state role='done'), or (2) manually by the user in the UI. A ticket with can_start=false must not be worked on until its blockers resolve. Epic blocker targets expand to that epic's open children (children in any lane whose role is not 'done', not archived); each expanded entry carries via_epic_id.",
360
+ description: "Return unresolved blockers for a ticket and a can_start boolean. Resolves board from board_id / board_slug / board first; the MCP session board is only a fallback convenience. The single source of truth for dependencies is the per-card `blocked_by` row in the relations table; if a row exists the blocker is unresolved. Rows are removed two ways: (1) automatically when the blocking ticket moves into the Done lane (state role='done'), or (2) manually by the user in the UI. A ticket with can_start=false must not be worked on until its blockers resolve. Epic blocker targets expand to that epic's open children (children in any lane whose role is not 'done', not archived); each expanded entry carries via_epic_id.",
338
361
  inputSchema: {
339
362
  type: "object",
340
363
  properties: {
@@ -351,7 +374,7 @@ const TOOL_DEFS = [
351
374
  {
352
375
  name: "board_search",
353
376
  description:
354
- "Search tickets, comments, and implementation records by text on the session's active board. Pass `board` (slug) only to explicitly search another board; omitted `board` never merges results from other boards.",
377
+ "Search tickets, comments, and implementation records by text on a specific board. Resolves board from board_id / board_slug / board first; the MCP session board is only a fallback convenience when selectors are omitted, and omitted selectors never merge results from other boards.",
355
378
  inputSchema: {
356
379
  type: "object",
357
380
  properties: {
@@ -373,7 +396,7 @@ const TOOL_DEFS = [
373
396
  {
374
397
  name: "board_create_ticket",
375
398
  description:
376
- "Create a new Orbit ticket/card on the active board. Use this instead of editing .orbit/board.db directly. Same operation as POST /api/tickets.",
399
+ "Create a new Orbit ticket/card. Resolves board from board_id / board_slug / board first; the MCP session board is only a fallback convenience. Use this instead of editing .orbit/board.db directly. Same operation as POST /api/tickets.",
377
400
  inputSchema: {
378
401
  type: "object",
379
402
  properties: {
@@ -399,11 +422,14 @@ const TOOL_DEFS = [
399
422
  {
400
423
  name: "board_update_ticket",
401
424
  description:
402
- "Update ticket fields such as AI plan, implementation summary, implementation updates, state, type, priority, or labels (full replace: array of label names).",
425
+ "Update ticket fields such as AI plan, implementation summary, implementation updates, state, type, priority, or labels (full replace: array of label names). Resolves board from board_id / board_slug / board; the MCP session board is only a fallback convenience.",
403
426
  inputSchema: {
404
427
  type: "object",
405
428
  properties: {
406
429
  ticket_id: { type: "string" },
430
+ board_id: { type: "string" },
431
+ board_slug: { type: "string" },
432
+ board: { type: "string" },
407
433
  title: { type: "string" },
408
434
  description: { type: "string" },
409
435
  type: { type: "string" },
@@ -422,11 +448,14 @@ const TOOL_DEFS = [
422
448
  },
423
449
  {
424
450
  name: "board_add_comment",
425
- description: "Add a ticket comment or agent breadcrumb.",
451
+ description: "Add a ticket comment or agent breadcrumb. Resolves board from board_id / board_slug / board; the MCP session board is only a fallback convenience.",
426
452
  inputSchema: {
427
453
  type: "object",
428
454
  properties: {
429
455
  ticket_id: { type: "string" },
456
+ board_id: { type: "string" },
457
+ board_slug: { type: "string" },
458
+ board: { type: "string" },
430
459
  body: { type: "string" },
431
460
  kind: { type: "string" }
432
461
  },
@@ -435,14 +464,73 @@ const TOOL_DEFS = [
435
464
  },
436
465
  handler: ({ ticket_id, ...body }) => orbitClient.addComment({ ticket_id, ...body })
437
466
  },
467
+ {
468
+ name: "board_create_review_verdict",
469
+ description: "Create a durable Sentinel/agent review verdict for a ticket. Verdict must be PASS, BLOCK, or QUESTION. Findings and evidence commands are stored as structured arrays; comments may mirror the data for humans but are not the source of truth. Resolves board from board_id / board_slug / board; the active session board is only a fallback convenience.",
470
+ inputSchema: {
471
+ type: "object",
472
+ properties: {
473
+ ticket_id: { type: "string" },
474
+ board_id: { type: "string" },
475
+ board_slug: { type: "string" },
476
+ board: { type: "string" },
477
+ verdict: { type: "string", enum: ["PASS", "BLOCK", "QUESTION"] },
478
+ blocking_findings: { type: "array" },
479
+ optional_findings: { type: "array" },
480
+ evidence_commands: { type: "array" },
481
+ reviewer_profile: { type: "string" },
482
+ reviewer_session_id: { type: "string" },
483
+ reviewed_commit_sha: { type: "string" },
484
+ dispatch_run_id: { type: "string" },
485
+ supersedes_prior_review_id: { type: ["string", "null"] }
486
+ },
487
+ required: ["ticket_id", "verdict"],
488
+ additionalProperties: false
489
+ },
490
+ handler: ({ ticket_id, ...body }) => orbitClient.createReviewVerdict({ ticket_id, ...body })
491
+ },
492
+ {
493
+ name: "board_list_review_verdicts",
494
+ description: "List durable review verdict records for a ticket, newest first. Use this for repair/re-review tooling instead of parsing prose comments.",
495
+ inputSchema: {
496
+ type: "object",
497
+ properties: {
498
+ ticket_id: { type: "string" },
499
+ board_id: { type: "string" },
500
+ board_slug: { type: "string" },
501
+ board: { type: "string" },
502
+ limit: { type: "integer", minimum: 1, maximum: 200 }
503
+ },
504
+ required: ["ticket_id"],
505
+ additionalProperties: false
506
+ },
507
+ handler: (args) => orbitClient.listReviewVerdicts(args)
508
+ },
509
+ {
510
+ name: "board_get_review_verdict",
511
+ description: "Read one durable review verdict record by id.",
512
+ inputSchema: {
513
+ type: "object",
514
+ properties: {
515
+ review_id: { type: "string" },
516
+ board_id: { type: "string" },
517
+ board_slug: { type: "string" },
518
+ board: { type: "string" }
519
+ },
520
+ required: ["review_id"],
521
+ additionalProperties: false
522
+ },
523
+ handler: (args) => orbitClient.getReviewVerdict(args)
524
+ },
438
525
  {
439
526
  name: "board_add_board_entry",
440
- description: "Add a durable board-level decision or lesson for future agents.",
527
+ description: "Add a durable board-level decision or lesson for future agents. Resolves board from board_id / board_slug / board first; the MCP session board is only a fallback convenience.",
441
528
  inputSchema: {
442
529
  type: "object",
443
530
  properties: {
444
531
  board_id: { type: "string" },
445
532
  board_slug: { type: "string" },
533
+ board: { type: "string" },
446
534
  type: { type: "string", enum: ["decision", "lesson"] },
447
535
  title: { type: "string" },
448
536
  body: { type: "string" },
@@ -456,11 +544,14 @@ const TOOL_DEFS = [
456
544
  {
457
545
  name: "board_checkpoint",
458
546
  description:
459
- "Pause mid-flight for a human: moves the ticket to Review (same lane as board_complete; checkpoint distinguishes a blocking question) and posts a checkpoint-kind comment with your message. Use when you cannot proceed without the user—not for normal 'work is done' handoff (use board_complete).",
547
+ "Pause mid-flight for a human: moves the ticket to Review (same lane as board_complete; checkpoint distinguishes a blocking question) and posts a checkpoint-kind comment with your message. Use when you cannot proceed without the user—not for normal 'work is done' handoff (use board_complete). Resolves board from board_id / board_slug / board; the MCP session board is only a fallback convenience.",
460
548
  inputSchema: {
461
549
  type: "object",
462
550
  properties: {
463
551
  ticket_id: { type: "string" },
552
+ board_id: { type: "string" },
553
+ board_slug: { type: "string" },
554
+ board: { type: "string" },
464
555
  message: { type: "string" }
465
556
  },
466
557
  required: ["ticket_id", "message"],
@@ -471,11 +562,14 @@ const TOOL_DEFS = [
471
562
  {
472
563
  name: "board_complete",
473
564
  description:
474
- "Hand off finished work for human review: moves the ticket to the Review lane (by role or name), writes a completion comment (summary, optional PR URL), and optional implementation_updates. This is the usual 'ready for you to look' path; use board_checkpoint only when blocked mid-flight.",
565
+ "Hand off finished work for human review: moves the ticket to the Review lane (by role or name), writes a completion comment (summary, optional PR URL), and optional implementation_updates. This is the usual 'ready for you to look' path; use board_checkpoint only when blocked mid-flight. Resolves board from board_id / board_slug / board; the MCP session board is only a fallback convenience.",
475
566
  inputSchema: {
476
567
  type: "object",
477
568
  properties: {
478
569
  ticket_id: { type: "string" },
570
+ board_id: { type: "string" },
571
+ board_slug: { type: "string" },
572
+ board: { type: "string" },
479
573
  summary: { type: "string" },
480
574
  updates: { type: "string" },
481
575
  pr_url: { type: "string" },
@@ -489,10 +583,10 @@ const TOOL_DEFS = [
489
583
  {
490
584
  name: "board_archive_ticket",
491
585
  description:
492
- "Archive (soft-delete) a ticket. The ticket is moved off the board into the Archive: it is excluded from bootstrap, search, claim-next, blockers, and relations, but its data and comments are preserved. Reverse with board_restore_ticket; permanently remove with board_delete_ticket.",
586
+ "Archive (soft-delete) a ticket. The ticket is moved off the board into the Archive: it is excluded from bootstrap, search, claim-next, blockers, and relations, but its data and comments are preserved. Reverse with board_restore_ticket; permanently remove with board_delete_ticket. Resolves board from board_id / board_slug / board; the MCP session board is only a fallback convenience.",
493
587
  inputSchema: {
494
588
  type: "object",
495
- properties: { ticket_id: { type: "string" } },
589
+ properties: { ticket_id: { type: "string" }, board_id: { type: "string" }, board_slug: { type: "string" }, board: { type: "string" } },
496
590
  required: ["ticket_id"],
497
591
  additionalProperties: false
498
592
  },
@@ -500,10 +594,10 @@ const TOOL_DEFS = [
500
594
  },
501
595
  {
502
596
  name: "board_restore_ticket",
503
- description: "Restore an archived ticket back to the board in its previous lane (state).",
597
+ description: "Restore an archived ticket back to the board in its previous lane (state). Resolves board from board_id / board_slug / board; the MCP session board is only a fallback convenience.",
504
598
  inputSchema: {
505
599
  type: "object",
506
- properties: { ticket_id: { type: "string" } },
600
+ properties: { ticket_id: { type: "string" }, board_id: { type: "string" }, board_slug: { type: "string" }, board: { type: "string" } },
507
601
  required: ["ticket_id"],
508
602
  additionalProperties: false
509
603
  },
@@ -512,10 +606,10 @@ const TOOL_DEFS = [
512
606
  {
513
607
  name: "board_delete_ticket",
514
608
  description:
515
- "Permanently delete a ticket. The ticket MUST already be archived (call board_archive_ticket first) — otherwise this returns 409 ticket_not_archived. This cannot be undone: comments, labels, and relations are removed via cascade. Events for this ticket are kept but their ticket_id becomes NULL.",
609
+ "Permanently delete a ticket. The ticket MUST already be archived (call board_archive_ticket first) — otherwise this returns 409 ticket_not_archived. This cannot be undone: comments, labels, and relations are removed via cascade. Events for this ticket are kept but their ticket_id becomes NULL. Resolves board from board_id / board_slug / board; the MCP session board is only a fallback convenience.",
516
610
  inputSchema: {
517
611
  type: "object",
518
- properties: { ticket_id: { type: "string" } },
612
+ properties: { ticket_id: { type: "string" }, board_id: { type: "string" }, board_slug: { type: "string" }, board: { type: "string" } },
519
613
  required: ["ticket_id"],
520
614
  additionalProperties: false
521
615
  },
@@ -536,12 +630,13 @@ const TOOL_DEFS = [
536
630
  },
537
631
  {
538
632
  name: "board_export_board",
539
- description: "Export a board snapshot as JSON for backup or transfer.",
633
+ description: "Export a board snapshot as JSON for backup or transfer. Resolves board from board_id / board_slug / board first; the MCP session board is only a fallback convenience.",
540
634
  inputSchema: {
541
635
  type: "object",
542
636
  properties: {
543
637
  board_id: { type: "string" },
544
638
  board_slug: { type: "string" },
639
+ board: { type: "string" },
545
640
  include_attachments: { type: "boolean", description: "Embed attached image bytes in the JSON snapshot." },
546
641
  include_images: { type: "boolean", description: "Alias for include_attachments." }
547
642
  },
@@ -552,12 +647,13 @@ const TOOL_DEFS = [
552
647
  {
553
648
  name: "board_update_settings",
554
649
  description:
555
- "PATCH-equivalent for board settings: name (display rename only; slug/canonical URLs stay unchanged), repo_url, system_path, default_branch, agent_instructions (project-level agent context), and project_notes (Notes For You).",
650
+ "PATCH-equivalent for board settings: name (display rename only; slug/canonical URLs stay unchanged), repo_url, system_path, default_branch, agent_instructions (project-level agent context), and project_notes (Notes For You). Resolves board from board_id / board_slug / board; the MCP session board is only a fallback convenience.",
556
651
  inputSchema: {
557
652
  type: "object",
558
653
  properties: {
559
654
  board_id: { type: "string" },
560
655
  board_slug: { type: "string" },
656
+ board: { type: "string" },
561
657
  name: { type: "string" },
562
658
  repo_url: { type: "string" },
563
659
  system_path: { type: "string" },
package/src/server.js CHANGED
File without changes