standup-mr 0.3.1 → 0.3.3

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/CHANGELOG.md CHANGED
@@ -4,6 +4,35 @@ All notable changes to standup-mr are recorded here. The format follows
4
4
  [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project uses
5
5
  [semantic versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [0.3.3] - 2026-09-01
8
+
9
+ ### Fixed
10
+
11
+ - The MCP server announced itself as version 0.3.0 in the `initialize`
12
+ handshake while the package was already 0.3.2, so every client listed a
13
+ version that had not shipped for two releases. The version is now read from
14
+ `package.json` at runtime and cannot drift again — the handshake test
15
+ asserts the two match.
16
+
17
+ ### Added
18
+
19
+ - `glama.json` and a Glama score badge in the README.
20
+
21
+ ## [0.3.2] - 2026-09-01
22
+
23
+ Metadata only — no functional change, and nothing to do if you are already on
24
+ 0.3.1.
25
+
26
+ ### Added
27
+
28
+ - A project icon (`assets/`), referenced from `server.json` so the MCP
29
+ Registry and directories can show it. SVG plus 512x512 and 400x400 PNGs.
30
+
31
+ ### Fixed
32
+
33
+ - The release workflow no longer fails when the version being tagged is
34
+ already on npm; the publish step checks first and exits cleanly.
35
+
7
36
  ## [0.3.1] - 2026-09-01
8
37
 
9
38
  ### Fixed
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # standup-mr
2
2
 
3
+ [![standup-mr MCP server](https://glama.ai/mcp/servers/Jubstaaa/standup-mr/badges/score.svg)](https://glama.ai/mcp/servers/Jubstaaa/standup-mr)
4
+
3
5
  Standup notes from **merge request state**, not commit logs.
4
6
 
5
7
  Most standup tools read your local `git log`. That answers "what did I type",
package/dist/cli.js CHANGED
@@ -8,9 +8,9 @@ import {
8
8
  } from "./chunk-2X2XEEUY.js";
9
9
 
10
10
  // src/cli/cli.ts
11
- import { existsSync, readFileSync, realpathSync } from "fs";
12
- import { dirname, join } from "path";
13
- import { fileURLToPath, pathToFileURL } from "url";
11
+ import { existsSync as existsSync2, readFileSync as readFileSync2, realpathSync } from "fs";
12
+ import { dirname as dirname2, join as join2 } from "path";
13
+ import { fileURLToPath as fileURLToPath2, pathToFileURL } from "url";
14
14
  import { parseArgs } from "util";
15
15
 
16
16
  // src/cli/cli.constants.ts
@@ -35,12 +35,10 @@ standup instructions prints the note-writing playbook (the standup skill body)
35
35
  to stdout, for teaching a non-Claude assistant the same rules, e.g.:
36
36
  npx standup-mr instructions >> AGENTS.md`;
37
37
 
38
- // src/cli/cli.ts
39
- async function readStdin() {
40
- const chunks = [];
41
- for await (const chunk of process.stdin) chunks.push(Buffer.from(chunk));
42
- return Buffer.concat(chunks).toString("utf8");
43
- }
38
+ // src/manifest/manifest.ts
39
+ import { existsSync, readFileSync } from "fs";
40
+ import { dirname, join } from "path";
41
+ import { fileURLToPath } from "url";
44
42
  function findPackageRoot(startDir) {
45
43
  let dir = startDir;
46
44
  while (!existsSync(join(dir, "package.json"))) {
@@ -52,13 +50,20 @@ function findPackageRoot(startDir) {
52
50
  }
53
51
  return dir;
54
52
  }
53
+
54
+ // src/cli/cli.ts
55
+ async function readStdin() {
56
+ const chunks = [];
57
+ for await (const chunk of process.stdin) chunks.push(Buffer.from(chunk));
58
+ return Buffer.concat(chunks).toString("utf8");
59
+ }
55
60
  function readStandupSkillBody() {
56
- const moduleDir = dirname(fileURLToPath(import.meta.url));
57
- const skillPath = join(findPackageRoot(moduleDir), "skills", "standup", "SKILL.md");
58
- if (!existsSync(skillPath)) {
61
+ const moduleDir = dirname2(fileURLToPath2(import.meta.url));
62
+ const skillPath = join2(findPackageRoot(moduleDir), "skills", "standup", "SKILL.md");
63
+ if (!existsSync2(skillPath)) {
59
64
  throw new Error(`Cannot find the standup skill file at ${skillPath}`);
60
65
  }
61
- const content = readFileSync(skillPath, "utf8");
66
+ const content = readFileSync2(skillPath, "utf8");
62
67
  const withoutFrontmatter = content.replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n/, "");
63
68
  return withoutFrontmatter.replace(/^\n+/, "");
64
69
  }
@@ -110,8 +115,8 @@ async function main(argv) {
110
115
  return 0;
111
116
  }
112
117
  if (command === "mcp") {
113
- const moduleDir = dirname(fileURLToPath(import.meta.url));
114
- const serverPath = join(findPackageRoot(moduleDir), "dist", "mcp", "server.js");
118
+ const moduleDir = dirname2(fileURLToPath2(import.meta.url));
119
+ const serverPath = join2(findPackageRoot(moduleDir), "dist", "mcp", "server.js");
115
120
  const serverUrl = pathToFileURL(serverPath).href;
116
121
  const { main: startMcpServer } = await import(serverUrl);
117
122
  await startMcpServer();
@@ -6,6 +6,30 @@ import { pathToFileURL } from "url";
6
6
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
7
7
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
8
8
 
9
+ // src/manifest/manifest.ts
10
+ import { existsSync, readFileSync } from "fs";
11
+ import { dirname, join } from "path";
12
+ import { fileURLToPath } from "url";
13
+ function findPackageRoot(startDir) {
14
+ let dir = startDir;
15
+ while (!existsSync(join(dir, "package.json"))) {
16
+ const parent = dirname(dir);
17
+ if (parent === dir) {
18
+ throw new Error(`Could not locate package.json above ${startDir}`);
19
+ }
20
+ dir = parent;
21
+ }
22
+ return dir;
23
+ }
24
+ function packageVersion(moduleUrl) {
25
+ const root = findPackageRoot(dirname(fileURLToPath(moduleUrl)));
26
+ const manifest = JSON.parse(readFileSync(join(root, "package.json"), "utf8"));
27
+ if (!manifest.version) {
28
+ throw new Error(`package.json at ${root} has no version`);
29
+ }
30
+ return manifest.version;
31
+ }
32
+
9
33
  // src/config/config.ts
10
34
  import { execFileSync } from "child_process";
11
35
 
@@ -1020,7 +1044,7 @@ async function collect(options = {}) {
1020
1044
  return buildReport(provider, /* @__PURE__ */ new Date(), options.lang ?? "en");
1021
1045
  }
1022
1046
  async function main() {
1023
- const server = new McpServer({ name: "standup-mr", version: "0.3.0" });
1047
+ const server = new McpServer({ name: "standup-mr", version: packageVersion(import.meta.url) });
1024
1048
  server.tool(
1025
1049
  "get_standup_data",
1026
1050
  "Collect merge-request-based standup data from GitLab or GitHub. Returns the previous working day activity, open merge requests or pull requests bucketed by state (ready / blocked / draft / stale), pending reviews, and the error lines from any failed pipeline or check.",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "standup-mr",
3
- "version": "0.3.1",
3
+ "version": "0.3.3",
4
4
  "mcpName": "io.github.Jubstaaa/standup-mr",
5
5
  "description": "Standup notes from merge request state, not commit logs.",
6
6
  "keywords": [