@thehammer/danx-dashboard-mcp 0.1.195 → 0.1.197

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.
@@ -8,6 +8,10 @@
8
8
  * 36 KB `danxbot_api_list`) because nothing an agent
9
9
  * reads before its first call showed the right shape. The tool description
10
10
  * is the one surface every profile and every operator session carries.
11
+ * DX-4016 — the DX-3678 phase C run found the non-work profiles still paying
12
+ * a 4xx on three writes: a card create without `plan`, an edit whose `ac[]`
13
+ * items were keyed `text` (and one with no `content_hash`), and a retro whose
14
+ * flag was false but whose description was missing, then prose.
11
15
  *
12
16
  * Kept as data, not prose, so danxbot's own tests can check each example
13
17
  * against the live server contract (route table, resource fields, body
@@ -25,10 +29,15 @@ export const DANXBOT_API_EXAMPLES = {
25
29
  path: "/api/issues",
26
30
  query: { filter: { status_derived: "ToDo", q: "<text>" } },
27
31
  },
32
+ cardCreate: {
33
+ method: "POST",
34
+ path: "/api/issues",
35
+ body: { board: "<repo>:<slug>", type: "Bug", title: "<title>", description: "<markdown>", plan: null },
36
+ },
28
37
  cardEdit: {
29
38
  method: "PATCH",
30
39
  path: "/api/issues/<id>/edit",
31
- body: { description: "<markdown>", content_hash: "<content_hash from your read>" },
40
+ body: { description: "<markdown>", ac: [{ title: "<criterion>" }], content_hash: "<content_hash from your read>" },
32
41
  },
33
42
  comment: {
34
43
  method: "POST",
@@ -40,6 +49,19 @@ export const DANXBOT_API_EXAMPLES = {
40
49
  path: "/api/issues/<id>/checklists/<checklists[].id>/items/<items[].id>",
41
50
  body: { status: "passing" },
42
51
  },
52
+ retro: {
53
+ method: "PUT",
54
+ path: "/api/issues/<id>/retro",
55
+ body: {
56
+ good: "<text>",
57
+ bad: "<text>",
58
+ correctable_danxbot_problem: false,
59
+ correctable_danxbot_problem_description: "",
60
+ action_item_ids: [],
61
+ commits: [{ sha: "<sha>" }],
62
+ tests: [],
63
+ },
64
+ },
43
65
  };
44
66
  /** The retro route's accepted `tests[].kind` values. */
45
67
  export const RETRO_TEST_KIND_EXAMPLES = ["group", "e2e"];
@@ -52,8 +74,10 @@ export function danxbotApiExamplesText() {
52
74
  const e = DANXBOT_API_EXAMPLES;
53
75
  return (`Correct first calls: card read ${render(e.cardRead)} (\`fields\` is an object, never a comma string); ` +
54
76
  `card list ${render(e.cardList)} (filters only inside \`filter\`); ` +
55
- `card edit ${render(e.cardEdit)}; ` +
77
+ `card create ${render(e.cardCreate)} (\`plan\` required: "mine" or null); ` +
78
+ `card edit ${render(e.cardEdit)} (only the keys you change; \`ac\` replaces the list); ` +
56
79
  `comment ${render(e.comment)}; ` +
57
80
  `AC tick ${render(e.acTick)}; ` +
58
- `retro \`tests[].kind\` is ${RETRO_TEST_KIND_EXAMPLES.map((k) => `"${k}"`).join(" or ")}.`);
81
+ `retro ${render(e.retro)} (description "" unless the flag is true; ` +
82
+ `\`tests[].kind\` ${RETRO_TEST_KIND_EXAMPLES.map((k) => `"${k}"`).join(" or ")}).`);
59
83
  }
package/dist/index.js CHANGED
@@ -345,7 +345,12 @@ strictTool("danxbot_api", "Call any dashboard API route your credential may reac
345
345
  "the dashboard's own `plan_list.listener_unattached` reminder relayed there (DX-3997). `board` overrides this dispatch's configured board for a board-scoped route only " +
346
346
  "(ignored by a route that isn't board-scoped). See this server's own instructions (shown once, at connect) " +
347
347
  "for the shared resource shape, the stale-hash rule, and how to read a refusal — don't know the route? call " +
348
- "`danxbot_api_list` first; unsure of its exact shape? call `danxbot_api_spec` first. " +
348
+ "`danxbot_api_list` first. " +
349
+ // DX-4015 — the ONE statement of which writes need a spec call first; the
350
+ // `work` profile's spec-first sentence defers to this list. A shown write
351
+ // is copied from its example (3 of 3 canary sessions did, with zero 4xx).
352
+ "Before your first write to a route not shown below, and always before `PUT /api/issues/:id/retro`, " +
353
+ "call `danxbot_api_spec`. " +
349
354
  // DX-3923 — the shapes agents guessed wrong most often, shown before the
350
355
  // first call instead of learned from a 4xx.
351
356
  danxbotApiExamplesText(), {
@@ -59,17 +59,10 @@ export function transcriptPathFromEnv(env) {
59
59
  const realWatcher = (options) => new SessionLogWatcher(options);
60
60
  /** The collector's dispatch-id argument; the heartbeat is addressed by session, not dispatch. */
61
61
  const OPERATOR_DISPATCH_REF = "operator-session";
62
- /**
63
- * DX-3962 - the bridge's collector. `"operator-bridge"` is the ONE mode that credits a sub-agent's replies to the card
64
- * it claimed (from its own transcript's pickup); a worker builds its collector with attribution off.
65
- */
66
- function newCollector() {
67
- return new DispatchUsage("operator-bridge");
68
- }
69
62
  export class OperatorSessionStats {
70
63
  transcriptPath;
71
64
  makeWatcher;
72
- usage = newCollector();
65
+ usage = new DispatchUsage();
73
66
  watcher = null;
74
67
  stopped = false;
75
68
  constructor(transcriptPath, makeWatcher = realWatcher) {
@@ -160,7 +153,7 @@ export class OperatorSessionStats {
160
153
  return;
161
154
  watcher.stop();
162
155
  this.watcher = null;
163
- this.usage = newCollector();
156
+ this.usage = new DispatchUsage();
164
157
  })
165
158
  .catch((err) => {
166
159
  process.stderr.write(`operator session stats: transcript watcher failed: ${err.message}\n`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thehammer/danx-dashboard-mcp",
3
- "version": "0.1.195",
3
+ "version": "0.1.197",
4
4
  "description": "Stdio MCP server fronting danxbot's dashboard API for agents (operator sessions and dispatched workers alike): the generic danxbot_api/danxbot_api_list/danxbot_api_spec tools reach any route the caller's credential may call, plus dedicated agent-specific tools (plan_connect, danxbot_complete, and other per-dispatch lifecycle callbacks) (DX-3465, PLN-11 R-25).",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -31,7 +31,7 @@
31
31
  },
32
32
  "dependencies": {
33
33
  "@modelcontextprotocol/sdk": "1.29.0",
34
- "@thehammer/danx-session-telemetry": "0.1.21",
34
+ "@thehammer/danx-session-telemetry": "0.1.19",
35
35
  "zod": "^3.25.76"
36
36
  },
37
37
  "devDependencies": {