@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.
- package/dist/danxbot-api-examples.js +27 -3
- package/dist/index.js +6 -1
- package/dist/session-stats.js +2 -9
- package/package.json +2 -2
|
@@ -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
|
|
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
|
|
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
|
|
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(), {
|
package/dist/session-stats.js
CHANGED
|
@@ -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 =
|
|
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 =
|
|
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.
|
|
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.
|
|
34
|
+
"@thehammer/danx-session-telemetry": "0.1.19",
|
|
35
35
|
"zod": "^3.25.76"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|