@thehammer/danx-dashboard-mcp 0.1.15 → 0.1.16

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/dist/handlers.js CHANGED
@@ -63,6 +63,8 @@ export async function issueCreate(client, args, defaultBoard) {
63
63
  body.effort_level = args.effort_level;
64
64
  if (args.list_id !== undefined)
65
65
  body.list_id = args.list_id;
66
+ if (args.required_gates !== undefined)
67
+ body.required_gates = args.required_gates;
66
68
  if (args.phase_children !== undefined)
67
69
  body.phase_children = args.phase_children;
68
70
  return client.request({ method: "POST", path: "", body, board });
package/dist/index.js CHANGED
@@ -139,7 +139,7 @@ server.tool("issue_get", "Fetch a single hydrated issue via GET /api/issues/:id.
139
139
  ...boardField,
140
140
  }, async (args) => jsonResult(await issueGet(client, args)));
141
141
  // ---------------- issue_create ----------------
142
- server.tool("issue_create", "Create a fresh card via POST /api/issues. Board-scoped; defaults to the dispatch's board. Pass `board` (a qualified id `<repo>:<slug>`) to create the card on another board (forwarded into body.board + ?board=; unknown board → 404). INVARIANT: type=Epic REQUIRES non-empty phase_children[] (epic-with-phases atomicity per DX-575) and the route atomically inserts the epic + every phase in ONE transaction. Non-Epic types REFUSE phase_children[] with 400. Status defaults to Review (no lifecycle timestamps stamped on create). parent_id optional. ac items take {title}; phase children inherit the new epic's id as parent_id. Optional list_id PLACES the card directly into a column in ONE call. **Pass EITHER a board_lists id OR the list's display NAME (case-insensitive, emoji-tolerant — e.g. a queue name like \"⚙️ Fulfillment Queue\" or just \"Fulfillment Queue\") — the server resolves a name to its id.** The card lands DIRECTLY in that column with the matching lifecycle stamped automatically — a `ready`-type queue → ToDo, a `completed` list → Done, etc. **You do NOT need a separate issue_transition(ready) + issue_edit(list_id) afterward — just pass the queue name here and the card is created already in that column.** Omit list_id for the default (Review). NOT valid on type=Epic (Epic status derives from children) → 400. Unknown name/id → 400.", {
142
+ server.tool("issue_create", "Create a fresh card via POST /api/issues. Board-scoped; defaults to the dispatch's board. Pass `board` (a qualified id `<repo>:<slug>`) to create the card on another board (forwarded into body.board + ?board=; unknown board → 404). INVARIANT: type=Epic REQUIRES non-empty phase_children[] (epic-with-phases atomicity per DX-575) and the route atomically inserts the epic + every phase in ONE transaction. Non-Epic types REFUSE phase_children[] with 400. Status defaults to Review (no lifecycle timestamps stamped on create). parent_id optional. ac items take {title}; phase children inherit the new epic's id as parent_id. Optional list_id PLACES the card directly into a column in ONE call. **Pass EITHER a board_lists id OR the list's display NAME (case-insensitive, emoji-tolerant — e.g. a queue name like \"⚙️ Fulfillment Queue\" or just \"Fulfillment Queue\") — the server resolves a name to its id.** The card lands DIRECTLY in that column with the matching lifecycle stamped automatically — a `ready`-type queue → ToDo, a `completed` list → Done, etc. **You do NOT need a separate issue_transition(ready) + issue_edit(list_id) afterward — just pass the queue name here and the card is created already in that column.** Omit list_id for the default (Review). NOT valid on type=Epic (Epic status derives from children) → 400. Unknown name/id → 400. Optional required_gates[] flags which quality gates (dependency, architecture, tdd, code) are REQUIRED on this card so they run pre-dispatch (only when the board also has that gate enabled); unknown gate name → 400.", {
143
143
  type: z.enum(ISSUE_TYPES),
144
144
  title: z.string().min(1),
145
145
  description: z.string(),
@@ -147,6 +147,10 @@ server.tool("issue_create", "Create a fresh card via POST /api/issues. Board-sco
147
147
  ac: z.array(z.object({ title: z.string().min(1) })).optional(),
148
148
  effort_level: z.enum(EFFORT_VALUES).nullable().optional(),
149
149
  list_id: z.string().min(1).nullable().optional(),
150
+ required_gates: z
151
+ .array(z.string().min(1))
152
+ .optional()
153
+ .describe('Optional array of quality-gate names to mark REQUIRED on this card (e.g. ["architecture","tdd"]). A gate only actually runs if the board has that gate ENABLED (master switch) AND it is required on the card. Use this when you (the creating agent) judge the card needs that pre-dispatch review gate; omit for cards that don\'t. Known gates: dependency, architecture, tdd, code. The operator can also toggle these per-card later in the issue drawer.'),
150
154
  phase_children: z
151
155
  .array(z.object({
152
156
  type: z.enum(NON_EPIC_TYPES),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thehammer/danx-dashboard-mcp",
3
- "version": "0.1.15",
3
+ "version": "0.1.16",
4
4
  "description": "Stdio MCP server wrapping danxbot's dashboard /api/issues/* normalized DB-backed HTTP routes for dispatched agents (DX-704 Phase 2).",
5
5
  "license": "MIT",
6
6
  "type": "module",