@thehammer/danx-dashboard-mcp 0.1.116 → 0.1.119
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 +10 -0
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/dist/handlers.js
CHANGED
|
@@ -633,6 +633,16 @@ export async function issueProblem(client, args) {
|
|
|
633
633
|
const problemId = need.id(args.problem_id, "problem_id");
|
|
634
634
|
const baseHash = need.string(args.base_hash, "base_hash");
|
|
635
635
|
const statement = need.string(args.statement, "statement");
|
|
636
|
+
// DX-3309 (test-review follow-up) — `type` is set once, at creation,
|
|
637
|
+
// and never editable afterward; the HTTP edit route already refuses it
|
|
638
|
+
// as an unknown key. This call used to silently DROP `type` on edit
|
|
639
|
+
// (it was never read from `args` here at all), so an agent
|
|
640
|
+
// "changing" question -> action got a 200 back with the type
|
|
641
|
+
// unchanged, no error, no signal anything was ignored. Fail loud
|
|
642
|
+
// instead: the fix for a wrong type is remove + re-add, never edit.
|
|
643
|
+
if (args.type !== undefined) {
|
|
644
|
+
throw new Error("issue_problem edit: type cannot be changed after creation — remove this problem and add a new one with the correct type");
|
|
645
|
+
}
|
|
636
646
|
return client.request({
|
|
637
647
|
method: "PATCH",
|
|
638
648
|
path: `/${idEnc}/problems/${problemId}`,
|
package/dist/index.js
CHANGED
|
@@ -610,7 +610,7 @@ const SOLUTION_FIELDS = {
|
|
|
610
610
|
con: z.string().optional(),
|
|
611
611
|
recommended: z.boolean().optional(),
|
|
612
612
|
};
|
|
613
|
-
strictTool("issue_problem", "A card's PROBLEMS via /api/issues/:id/problems[/:pid]: one statement the operator must resolve (a question, or a flaw in the plan) OR an action only a person can carry out, each with its own solutions/answers — one problem per question. OPEN = not yet answered; the card needs a human exactly while open_problem_count > 0 — there is no separate flag to set, adding a problem IS putting the card in front of a human. list → live problems in order, each {id, statement, context, type, summary, content_hash, open, solutions[], decisions[]}; add {statement, context?, type?, summary?, solutions?} → problem_id + solution_ids in one transaction (zero solutions is valid: the operator answers free-form) plus `problems_reminder: {open_problem_count, instruction}` naming each open problem's solution count; edit :pid {base_hash, statement, context?, summary?}; remove :pid {base_hash} — always allowed, even as the card's last open problem (DX-2830: removing it just means the card no longer needs a human). A stale base_hash → 409 `stale_problem` with currentHash + currentProblem: merge, then retry. No answer action — the operator answers in the dashboard. DX-2942 — `statement` is capped at 200 characters (a 400 names the actual length otherwise): write it as ONE plain sentence (a question for a question, the deed itself for an action), and put any investigation detail in `context` (markdown, no cap) instead of running it on. Good: statement \"Which cache should we use?\", context \"Redis fits the read-heavy path; see benchmark in #123. Memcached is simpler ops but no persistence.\" Bad: statement \"We looked at Redis vs Memcached, ran benchmarks showing Redis 3x faster on reads, but Memcached has simpler ops and we're not sure persistence matters here since the cache is fully rebuildable from Postgres...\" (too long, refused — move it to context).
|
|
613
|
+
strictTool("issue_problem", "A card's PROBLEMS via /api/issues/:id/problems[/:pid]: one statement the operator must resolve (a question, or a flaw in the plan) OR an action only a person can carry out, each with its own solutions/answers — one problem per question. OPEN = not yet answered; the card needs a human exactly while open_problem_count > 0 — there is no separate flag to set, adding a problem IS putting the card in front of a human. list → live problems in order, each {id, statement, context, type, summary, content_hash, open, solutions[], decisions[]}; add {statement, context?, type?, summary?, solutions?} → problem_id + solution_ids in one transaction (zero solutions is valid: the operator answers free-form) plus `problems_reminder: {open_problem_count, instruction}` naming each open problem's solution count; edit :pid {base_hash, statement, context?, summary?}; remove :pid {base_hash} — always allowed, even as the card's last open problem (DX-2830: removing it just means the card no longer needs a human). A stale base_hash → 409 `stale_problem` with currentHash + currentProblem: merge, then retry. No answer action — the operator answers in the dashboard. DX-2942 — `statement` is capped at 200 characters (a 400 names the actual length otherwise): write it as ONE plain sentence (a question for a question, the deed itself for an action), and put any investigation detail in `context` (markdown, no cap) instead of running it on. Good: statement \"Which cache should we use?\", context \"Redis fits the read-heavy path; see benchmark in #123. Memcached is simpler ops but no persistence.\" Bad: statement \"We looked at Redis vs Memcached, ran benchmarks showing Redis 3x faster on reads, but Memcached has simpler ops and we're not sure persistence matters here since the cache is fully rebuildable from Postgres...\" (too long, refused — move it to context). Every problem is also a `type`, with a `summary` distinct from `context`: read BOTH fields' own descriptions below before your first `add` — together they teach which type this is, and the three-field split (`statement` / `summary` / `context`) an action actually needs.", {
|
|
614
614
|
id: z.string().min(1),
|
|
615
615
|
action: z.enum(["list", "add", "edit", "remove"]),
|
|
616
616
|
problem_id: z.number().int().positive().optional().describe("edit/remove"),
|
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.119",
|
|
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",
|