standup-mr 0.3.2 → 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 +14 -0
- package/README.md +2 -0
- package/dist/cli.js +20 -15
- package/dist/mcp/server.js +25 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,20 @@ 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
|
+
|
|
7
21
|
## [0.3.2] - 2026-09-01
|
|
8
22
|
|
|
9
23
|
Metadata only — no functional change, and nothing to do if you are already on
|
package/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# standup-mr
|
|
2
2
|
|
|
3
|
+
[](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/
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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 =
|
|
57
|
-
const skillPath =
|
|
58
|
-
if (!
|
|
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 =
|
|
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 =
|
|
114
|
-
const serverPath =
|
|
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();
|
package/dist/mcp/server.js
CHANGED
|
@@ -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:
|
|
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.",
|