@starlove/orbit 1.1.2 → 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 +0 -0
  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 +0 -0
  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 +0 -0
  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 +0 -0
  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 +1 -0
  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 +176 -11
  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 +32 -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 +45 -19
  100. package/src/mcp-server.js +102 -27
  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/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, 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
- "Return the default lean context pack for a ticket: ticket fields, board identity only, relations, blockers, parent/children, and related ticket summaries. Project manual/journal and comments are intentionally omitted; use board_context for board manual/journal and board_read_comments for comment threads.",
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: {
@@ -264,7 +266,7 @@ const TOOL_DEFS = [
264
266
  {
265
267
  name: "board_get_ticket_context_full",
266
268
  description:
267
- "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. Comments are still intentionally omitted; use board_read_comments for comment threads.",
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.",
268
270
  inputSchema: {
269
271
  type: "object",
270
272
  properties: {
@@ -285,7 +287,7 @@ const TOOL_DEFS = [
285
287
  {
286
288
  name: "board_get_agent_dispatch_packet",
287
289
  description:
288
- "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.",
289
291
  inputSchema: {
290
292
  type: "object",
291
293
  properties: {
@@ -304,7 +306,7 @@ const TOOL_DEFS = [
304
306
  {
305
307
  name: "board_read_ticket",
306
308
  description:
307
- "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.",
308
310
  inputSchema: {
309
311
  type: "object",
310
312
  properties: {
@@ -322,7 +324,7 @@ const TOOL_DEFS = [
322
324
  {
323
325
  name: "board_read_comments",
324
326
  description:
325
- "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.",
326
328
  inputSchema: {
327
329
  type: "object",
328
330
  properties: {
@@ -339,7 +341,7 @@ const TOOL_DEFS = [
339
341
  },
340
342
  {
341
343
  name: "board_get_ticket_relations",
342
- 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.",
343
345
  inputSchema: {
344
346
  type: "object",
345
347
  properties: {
@@ -355,7 +357,7 @@ const TOOL_DEFS = [
355
357
  },
356
358
  {
357
359
  name: "board_get_ticket_blockers",
358
- 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.",
359
361
  inputSchema: {
360
362
  type: "object",
361
363
  properties: {
@@ -372,7 +374,7 @@ const TOOL_DEFS = [
372
374
  {
373
375
  name: "board_search",
374
376
  description:
375
- "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.",
376
378
  inputSchema: {
377
379
  type: "object",
378
380
  properties: {
@@ -394,7 +396,7 @@ const TOOL_DEFS = [
394
396
  {
395
397
  name: "board_create_ticket",
396
398
  description:
397
- "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.",
398
400
  inputSchema: {
399
401
  type: "object",
400
402
  properties: {
@@ -420,11 +422,14 @@ const TOOL_DEFS = [
420
422
  {
421
423
  name: "board_update_ticket",
422
424
  description:
423
- "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.",
424
426
  inputSchema: {
425
427
  type: "object",
426
428
  properties: {
427
429
  ticket_id: { type: "string" },
430
+ board_id: { type: "string" },
431
+ board_slug: { type: "string" },
432
+ board: { type: "string" },
428
433
  title: { type: "string" },
429
434
  description: { type: "string" },
430
435
  type: { type: "string" },
@@ -443,11 +448,14 @@ const TOOL_DEFS = [
443
448
  },
444
449
  {
445
450
  name: "board_add_comment",
446
- 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.",
447
452
  inputSchema: {
448
453
  type: "object",
449
454
  properties: {
450
455
  ticket_id: { type: "string" },
456
+ board_id: { type: "string" },
457
+ board_slug: { type: "string" },
458
+ board: { type: "string" },
451
459
  body: { type: "string" },
452
460
  kind: { type: "string" }
453
461
  },
@@ -456,14 +464,73 @@ const TOOL_DEFS = [
456
464
  },
457
465
  handler: ({ ticket_id, ...body }) => orbitClient.addComment({ ticket_id, ...body })
458
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
+ },
459
525
  {
460
526
  name: "board_add_board_entry",
461
- 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.",
462
528
  inputSchema: {
463
529
  type: "object",
464
530
  properties: {
465
531
  board_id: { type: "string" },
466
532
  board_slug: { type: "string" },
533
+ board: { type: "string" },
467
534
  type: { type: "string", enum: ["decision", "lesson"] },
468
535
  title: { type: "string" },
469
536
  body: { type: "string" },
@@ -477,11 +544,14 @@ const TOOL_DEFS = [
477
544
  {
478
545
  name: "board_checkpoint",
479
546
  description:
480
- "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.",
481
548
  inputSchema: {
482
549
  type: "object",
483
550
  properties: {
484
551
  ticket_id: { type: "string" },
552
+ board_id: { type: "string" },
553
+ board_slug: { type: "string" },
554
+ board: { type: "string" },
485
555
  message: { type: "string" }
486
556
  },
487
557
  required: ["ticket_id", "message"],
@@ -492,11 +562,14 @@ const TOOL_DEFS = [
492
562
  {
493
563
  name: "board_complete",
494
564
  description:
495
- "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.",
496
566
  inputSchema: {
497
567
  type: "object",
498
568
  properties: {
499
569
  ticket_id: { type: "string" },
570
+ board_id: { type: "string" },
571
+ board_slug: { type: "string" },
572
+ board: { type: "string" },
500
573
  summary: { type: "string" },
501
574
  updates: { type: "string" },
502
575
  pr_url: { type: "string" },
@@ -510,10 +583,10 @@ const TOOL_DEFS = [
510
583
  {
511
584
  name: "board_archive_ticket",
512
585
  description:
513
- "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.",
514
587
  inputSchema: {
515
588
  type: "object",
516
- properties: { ticket_id: { type: "string" } },
589
+ properties: { ticket_id: { type: "string" }, board_id: { type: "string" }, board_slug: { type: "string" }, board: { type: "string" } },
517
590
  required: ["ticket_id"],
518
591
  additionalProperties: false
519
592
  },
@@ -521,10 +594,10 @@ const TOOL_DEFS = [
521
594
  },
522
595
  {
523
596
  name: "board_restore_ticket",
524
- 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.",
525
598
  inputSchema: {
526
599
  type: "object",
527
- properties: { ticket_id: { type: "string" } },
600
+ properties: { ticket_id: { type: "string" }, board_id: { type: "string" }, board_slug: { type: "string" }, board: { type: "string" } },
528
601
  required: ["ticket_id"],
529
602
  additionalProperties: false
530
603
  },
@@ -533,10 +606,10 @@ const TOOL_DEFS = [
533
606
  {
534
607
  name: "board_delete_ticket",
535
608
  description:
536
- "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.",
537
610
  inputSchema: {
538
611
  type: "object",
539
- properties: { ticket_id: { type: "string" } },
612
+ properties: { ticket_id: { type: "string" }, board_id: { type: "string" }, board_slug: { type: "string" }, board: { type: "string" } },
540
613
  required: ["ticket_id"],
541
614
  additionalProperties: false
542
615
  },
@@ -557,12 +630,13 @@ const TOOL_DEFS = [
557
630
  },
558
631
  {
559
632
  name: "board_export_board",
560
- 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.",
561
634
  inputSchema: {
562
635
  type: "object",
563
636
  properties: {
564
637
  board_id: { type: "string" },
565
638
  board_slug: { type: "string" },
639
+ board: { type: "string" },
566
640
  include_attachments: { type: "boolean", description: "Embed attached image bytes in the JSON snapshot." },
567
641
  include_images: { type: "boolean", description: "Alias for include_attachments." }
568
642
  },
@@ -573,12 +647,13 @@ const TOOL_DEFS = [
573
647
  {
574
648
  name: "board_update_settings",
575
649
  description:
576
- "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.",
577
651
  inputSchema: {
578
652
  type: "object",
579
653
  properties: {
580
654
  board_id: { type: "string" },
581
655
  board_slug: { type: "string" },
656
+ board: { type: "string" },
582
657
  name: { type: "string" },
583
658
  repo_url: { type: "string" },
584
659
  system_path: { type: "string" },
package/src/server.js CHANGED
File without changes