@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 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`) or change type (`frontend` / `backend` / `api` / `other`) or page URL. The legacy status names `open` / `done` are accepted too. |
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.9" });
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.9",
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.9"
49
+ "@loupekit/shared": "0.10.10-next.55"
50
50
  }
51
51
  }