@loupekit/mcp 0.10.9 → 0.10.10-next.55
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/README.md +1 -1
- package/dist/index.js +12 -3
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -51,7 +51,7 @@ element, its state, and the page.
|
|
|
51
51
|
|
|
52
52
|
| Tool | Description |
|
|
53
53
|
| --- | --- |
|
|
54
|
-
| `list_comments(status?, priority?, changeType?, url?)` | List comments, optionally filtered by stage (`queue` / `todo` / `in_progress` / `in_review` / `resolved`), priority (`critical` / `high` / `medium` / `low`)
|
|
54
|
+
| `list_comments(status?, priority?, changeType?, repo?, branch?, url?)` | List comments, optionally filtered by stage (`queue` / `todo` / `in_progress` / `in_review` / `resolved`), priority (`critical` / `high` / `medium` / `low`), change type (`frontend` / `backend` / `api` / `other`), repository, branch or page URL. The legacy status names `open` / `done` are accepted too. |
|
|
55
55
|
| `get_comment(id)` | The full Claude-ready package for one comment: request + element HTML + computed styles + the **screenshot as an image** + any screen-recording URL. |
|
|
56
56
|
| `propose_change(id, html, css?, notes?)` | Write your **modified HTML/CSS** back onto the comment. The dashboard renders it as code plus a live before/after preview for the dev team. |
|
|
57
57
|
| `update_status(id, status)` | Move a comment along the board (`queue` → `todo` → `in_progress` → `in_review` → `resolved`) so triage state stays in sync. Move to `in_review` when a change is ready — only a person resolves. |
|
package/dist/index.js
CHANGED
|
@@ -64,9 +64,14 @@ async function imageBlocks(attachments) {
|
|
|
64
64
|
return out;
|
|
65
65
|
}
|
|
66
66
|
var attachmentLines = (c) => (c.attachments ?? []).length ? ["", "**Attachments:**", ...(c.attachments ?? []).map((a) => `- ${a.kind === "video" ? "\u{1F3AC}" : "\u{1F5BC}"} ${a.name ?? "attachment"} \u2014 ${a.url}`)] : [];
|
|
67
|
-
async function listComments({ status, priority, changeType, url }) {
|
|
67
|
+
async function listComments({ status, priority, changeType, repo, branch, url }) {
|
|
68
68
|
const q = new URLSearchParams({ projectKey: PROJECT_KEY });
|
|
69
69
|
if (url) q.set("url", url);
|
|
70
|
+
if (status) q.set("status", status);
|
|
71
|
+
if (priority) q.set("priority", priority);
|
|
72
|
+
if (changeType) q.set("changeType", changeType);
|
|
73
|
+
if (repo) q.set("repo", repo);
|
|
74
|
+
if (branch) q.set("branch", branch);
|
|
70
75
|
let comments = await api(`/v1/comments?${q}`);
|
|
71
76
|
if (status) {
|
|
72
77
|
const want = normalizeStatus(status);
|
|
@@ -80,10 +85,12 @@ async function listComments({ status, priority, changeType, url }) {
|
|
|
80
85
|
const want = normalizeChangeType(changeType);
|
|
81
86
|
comments = comments.filter((c) => normalizeChangeType(c.changeType) === want);
|
|
82
87
|
}
|
|
88
|
+
if (repo) comments = comments.filter((c) => c.repo === repo);
|
|
89
|
+
if (branch) comments = comments.filter((c) => c.branch === branch);
|
|
83
90
|
if (!comments.length) return wrap("No comments match.");
|
|
84
91
|
const lines = comments.map(
|
|
85
92
|
(c) => `- [${STAGE_LABELS[normalizeStatus(c.status)]}] ${PRIORITY_LABELS[normalizePriority(c.priority)]} \xB7 ${CHANGE_TYPE_LABELS[normalizeChangeType(c.changeType)]} \xB7 #${c.id} \u2014 ${titleOf(c)}: ${c.body}
|
|
86
|
-
\u21B3 ${targetOf(c)} on ${c.url} (by ${c.author.name})`
|
|
93
|
+
\u21B3 ${targetOf(c)} on ${c.url} (by ${c.author.name})${c.repo ? ` [${c.repo}${c.branch ? ` @ ${c.branch}` : ""}]` : ""}`
|
|
87
94
|
);
|
|
88
95
|
return wrap(`${comments.length} comment(s):
|
|
89
96
|
|
|
@@ -163,7 +170,7 @@ async function proposeChange({ id, html, css, notes }) {
|
|
|
163
170
|
await api(`/v1/comments/${encodeURIComponent(id)}`, { method: "PATCH", body: JSON.stringify({ proposal }) });
|
|
164
171
|
return wrap(`Proposal saved for #${id}. The dev team can now review your modified HTML/CSS in the dashboard.`);
|
|
165
172
|
}
|
|
166
|
-
var server = new McpServer({ name: "loupe", version: "0.10.
|
|
173
|
+
var server = new McpServer({ name: "loupe", version: "0.10.10" });
|
|
167
174
|
server.tool(
|
|
168
175
|
"list_comments",
|
|
169
176
|
"List Loupe product-feedback comments for the project as a task backlog. Each item carries its board stage, priority and change type, so you can start with the most urgent. Use this to see what a PM has flagged, then work through the items.",
|
|
@@ -171,6 +178,8 @@ server.tool(
|
|
|
171
178
|
status: STAGE_ARG.optional().describe(`Filter by stage. Omit for all.`),
|
|
172
179
|
priority: PRIORITY_ARG.optional().describe("Filter by priority."),
|
|
173
180
|
changeType: CHANGE_TYPE_ARG.optional().describe("Filter by change type."),
|
|
181
|
+
repo: z.string().optional().describe('Filter to one repository, e.g. "org/repo".'),
|
|
182
|
+
branch: z.string().optional().describe('Filter to one branch, e.g. "main".'),
|
|
174
183
|
url: z.string().optional().describe("Filter to a single page path, e.g. /checkout.")
|
|
175
184
|
},
|
|
176
185
|
listComments
|
package/package.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"email": "m.ashraf.saed@gmail.com",
|
|
6
6
|
"url": "https://www.linkedin.com/in/mohamedashrafelsaed/"
|
|
7
7
|
},
|
|
8
|
-
"version": "0.10.
|
|
8
|
+
"version": "0.10.10-next.55",
|
|
9
9
|
"description": "MCP server that exposes Loupe comments to Claude Code as an actionable, fully-contextualized backlog.",
|
|
10
10
|
"keywords": [
|
|
11
11
|
"loupe",
|
|
@@ -46,6 +46,6 @@
|
|
|
46
46
|
"zod": "^3.24.1"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
|
-
"@loupekit/shared": "0.10.
|
|
49
|
+
"@loupekit/shared": "0.10.10-next.55"
|
|
50
50
|
}
|
|
51
51
|
}
|