@maind-dev/cli 0.4.0 → 0.6.1

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.
@@ -1,221 +0,0 @@
1
- // Minimal Streamable-HTTP MCP client for the maind CLI.
2
- //
3
- // Intentionally thin — same philosophy as apps/mcp-bridge/src/forward.ts, but
4
- // instead of piping JSON-RPC frames to stdout it performs a request/response
5
- // round-trip and returns the parsed result. We don't pull in the full MCP SDK:
6
- // the CLI only needs initialize → notifications/initialized → tools/call.
7
- //
8
- // Streamable HTTP means each POST may answer with a one-shot JSON body OR a
9
- // text/event-stream. Both are unpacked to a single JSON-RPC message here.
10
- const DEFAULT_MCP_URL = "https://mcp.maind.dev/mcp";
11
- const CLIENT_FAMILY = "maind-cli";
12
- export class McpError extends Error {
13
- code;
14
- constructor(message, code) {
15
- super(message);
16
- this.code = code;
17
- this.name = "McpError";
18
- }
19
- }
20
- export class McpClient {
21
- mcpUrl;
22
- apiKey;
23
- deviceId;
24
- clientVersion;
25
- sessionId = null;
26
- nextId = 1;
27
- initialized = false;
28
- constructor(cfg) {
29
- this.apiKey = cfg.apiKey;
30
- this.deviceId = cfg.deviceId;
31
- this.clientVersion = cfg.clientVersion;
32
- this.mcpUrl = cfg.mcpUrl ?? process.env.MAIND_MCP_URL ?? DEFAULT_MCP_URL;
33
- }
34
- headers() {
35
- const h = {
36
- "content-type": "application/json",
37
- accept: "application/json, text/event-stream",
38
- authorization: `Bearer ${this.apiKey}`,
39
- "x-maind-client-family": CLIENT_FAMILY,
40
- "x-maind-client-version": this.clientVersion,
41
- };
42
- if (this.deviceId)
43
- h["x-maind-device-id"] = this.deviceId;
44
- if (this.sessionId)
45
- h["mcp-session-id"] = this.sessionId;
46
- return h;
47
- }
48
- /** Performs the MCP handshake: initialize, capture session-id, send initialized. */
49
- async connect() {
50
- if (this.initialized)
51
- return;
52
- const res = await this.post({
53
- jsonrpc: "2.0",
54
- id: this.nextId++,
55
- method: "initialize",
56
- params: {
57
- protocolVersion: "2025-06-18",
58
- capabilities: {},
59
- clientInfo: { name: CLIENT_FAMILY, version: this.clientVersion },
60
- },
61
- });
62
- if (res.message.error) {
63
- throw new McpError(`initialize failed: ${res.message.error.message}`, res.message.error.code);
64
- }
65
- if (res.sessionId)
66
- this.sessionId = res.sessionId;
67
- // Per MCP spec the client must acknowledge with an initialized notification
68
- // before issuing tool calls. Notifications carry no id and return 202.
69
- await this.post({ jsonrpc: "2.0", method: "notifications/initialized" });
70
- this.initialized = true;
71
- }
72
- /**
73
- * Calls a maind MCP tool and returns its decoded JSON payload. maind tools
74
- * return their result as a JSON string inside content[0].text, so we parse it.
75
- */
76
- async callTool(name, args) {
77
- if (!this.initialized)
78
- await this.connect();
79
- const res = await this.post({
80
- jsonrpc: "2.0",
81
- id: this.nextId++,
82
- method: "tools/call",
83
- params: { name, arguments: args },
84
- });
85
- if (res.message.error) {
86
- throw new McpError(`tool ${name} failed: ${res.message.error.message}`, res.message.error.code);
87
- }
88
- const result = res.message.result;
89
- const text = result?.content?.find((c) => c.type === "text" && typeof c.text === "string")?.text;
90
- if (typeof text !== "string") {
91
- throw new McpError(`tool ${name} returned no text content`);
92
- }
93
- const parsed = parseJsonLoose(text);
94
- if (parsed === undefined) {
95
- throw new McpError(`tool ${name} returned non-JSON text`);
96
- }
97
- return parsed;
98
- }
99
- /** POSTs a JSON-RPC frame and unpacks the JSON-or-SSE response. */
100
- async post(frame) {
101
- let response;
102
- try {
103
- response = await fetch(this.mcpUrl, {
104
- method: "POST",
105
- headers: this.headers(),
106
- body: JSON.stringify(frame),
107
- });
108
- }
109
- catch (err) {
110
- throw new McpError(`network error contacting ${this.mcpUrl}: ${stringifyErr(err)}`);
111
- }
112
- const sid = response.headers.get("mcp-session-id");
113
- if (response.status === 401) {
114
- const body = await response.text().catch(() => "");
115
- throw new McpError(`auth rejected (401): ${body.slice(0, 200)}`, 401);
116
- }
117
- // 202 Accepted: a notification with no body (e.g. notifications/initialized).
118
- if (response.status === 202) {
119
- return { message: { jsonrpc: "2.0", result: null }, sessionId: sid };
120
- }
121
- if (!response.ok) {
122
- const body = await response.text().catch(() => "");
123
- throw new McpError(`upstream HTTP ${response.status}: ${body.slice(0, 300)}`, response.status);
124
- }
125
- const contentType = response.headers.get("content-type") ?? "";
126
- const raw = contentType.startsWith("text/event-stream")
127
- ? await readSseMessage(response)
128
- : await response.text();
129
- if (raw.trim().length === 0) {
130
- return { message: { jsonrpc: "2.0", result: null }, sessionId: sid };
131
- }
132
- let message;
133
- try {
134
- message = JSON.parse(raw);
135
- }
136
- catch {
137
- throw new McpError(`could not parse JSON-RPC response: ${raw.slice(0, 200)}`);
138
- }
139
- return { message, sessionId: sid };
140
- }
141
- }
142
- /**
143
- * Reads an SSE body and returns the last complete `data:` payload — for a
144
- * request/response round-trip that is the single JSON-RPC response frame.
145
- */
146
- async function readSseMessage(response) {
147
- if (!response.body)
148
- return "";
149
- const reader = response.body.getReader();
150
- const decoder = new TextDecoder();
151
- let buffer = "";
152
- let dataLines = [];
153
- let lastPayload = "";
154
- const flush = () => {
155
- if (dataLines.length === 0)
156
- return;
157
- const payload = dataLines.join("\n").trim();
158
- dataLines = [];
159
- if (payload.length > 0)
160
- lastPayload = payload;
161
- };
162
- while (true) {
163
- const { value, done } = await reader.read();
164
- if (done)
165
- break;
166
- buffer += decoder.decode(value, { stream: true });
167
- let nl;
168
- while ((nl = buffer.indexOf("\n")) !== -1) {
169
- const rawLine = buffer.slice(0, nl);
170
- buffer = buffer.slice(nl + 1);
171
- const line = rawLine.endsWith("\r") ? rawLine.slice(0, -1) : rawLine;
172
- if (line === "") {
173
- flush();
174
- continue;
175
- }
176
- if (line.startsWith(":"))
177
- continue; // keep-alive comment
178
- if (line.startsWith("data:"))
179
- dataLines.push(line.slice(5).replace(/^\s/, ""));
180
- }
181
- }
182
- flush();
183
- return lastPayload;
184
- }
185
- function stringifyErr(err) {
186
- return err instanceof Error ? err.message : String(err);
187
- }
188
- /**
189
- * Parses a tool's text payload as JSON, tolerating a leading human-readable
190
- * prefix line. search_lessons returns pure JSON, but get_session_briefing
191
- * prefixes its JSON with "SESSION BRIEFING ...:\n\n". We first try a strict
192
- * parse, then fall back to the largest brace/bracket-delimited substring.
193
- * Returns undefined when no JSON can be recovered.
194
- */
195
- function parseJsonLoose(text) {
196
- const trimmed = text.trim();
197
- try {
198
- return JSON.parse(trimmed);
199
- }
200
- catch {
201
- // fall through to substring extraction
202
- }
203
- const firstObj = trimmed.indexOf("{");
204
- const firstArr = trimmed.indexOf("[");
205
- const candidates = [firstObj, firstArr].filter((i) => i >= 0);
206
- if (candidates.length === 0)
207
- return undefined;
208
- const start = Math.min(...candidates);
209
- const open = trimmed[start];
210
- const close = open === "{" ? "}" : "]";
211
- const end = trimmed.lastIndexOf(close);
212
- if (end <= start)
213
- return undefined;
214
- try {
215
- return JSON.parse(trimmed.slice(start, end + 1));
216
- }
217
- catch {
218
- return undefined;
219
- }
220
- }
221
- //# sourceMappingURL=mcp-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../src/mcp-client.ts"],"names":[],"mappings":"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"}
package/build/render.js DELETED
@@ -1,81 +0,0 @@
1
- // Rendering of the two CI artifacts:
2
- // - context.md — lesson bodies + a convention checklist for the agent in the runner
3
- // - manifest.json — the served lesson/convention IDs+versions (attribution backbone)
4
- //
5
- // The manifest is the load-bearing piece for later phases: a build-outcome signal
6
- // is only attributable to a lesson if we recorded that the lesson was actually in
7
- // the agent's context for that run. context.md is human/agent-facing; manifest.json
8
- // is machine-facing.
9
- export function buildManifest(lessons, conventions, meta) {
10
- return {
11
- schema: "maind.context.manifest/v1",
12
- generated_at: meta.generatedAt,
13
- key_prefix: meta.keyPrefix,
14
- run_ref: meta.runRef,
15
- stack: meta.stack,
16
- query: meta.query,
17
- served: lessons.map((l) => ({
18
- id: l.id,
19
- version: typeof l.version === "number" ? l.version : null,
20
- tier: l.tier ?? null,
21
- last_validated_at: l.last_validated_at ?? null,
22
- })),
23
- conventions: conventions.map((c) => c.id),
24
- };
25
- }
26
- export function renderContextMarkdown(lessons, conventions, meta) {
27
- const lines = [];
28
- lines.push("<!-- Generated by `maind context` — do not edit by hand. -->");
29
- lines.push(`<!-- generated_at: ${meta.generatedAt} | key: ${meta.keyPrefix}${meta.runRef ? ` | run: ${meta.runRef}` : ""} -->`);
30
- lines.push("");
31
- lines.push("# maind context");
32
- lines.push("");
33
- lines.push("Vetted lessons and conventions for this stack, pulled from maind for the agent " +
34
- "running in this CI job. Treat each lesson as reference material — weigh it against " +
35
- "the actual diff, don't apply blindly.");
36
- lines.push("");
37
- const stackLabel = meta.stack.length > 0 ? meta.stack.join(", ") : "(none)";
38
- lines.push(`**Stack:** ${stackLabel} · **Lessons:** ${lessons.length} · **Conventions:** ${conventions.length}`);
39
- lines.push("");
40
- if (conventions.length > 0) {
41
- lines.push("## Always-on conventions");
42
- lines.push("");
43
- for (const c of conventions) {
44
- lines.push(`- **${c.title}** \`${c.id}\``);
45
- }
46
- lines.push("");
47
- }
48
- if (lessons.length === 0) {
49
- lines.push("## Lessons");
50
- lines.push("");
51
- lines.push("_No stack-relevant lessons were returned for this query._");
52
- lines.push("");
53
- return lines.join("\n");
54
- }
55
- lines.push("## Lessons");
56
- lines.push("");
57
- for (const l of lessons) {
58
- lines.push(`### ${l.title}`);
59
- const meta2 = [`\`${l.id}\``];
60
- if (l.tier)
61
- meta2.push(l.tier);
62
- if (typeof l.version === "number")
63
- meta2.push(`v${l.version}`);
64
- if (l.last_validated_at)
65
- meta2.push(`validated ${l.last_validated_at}`);
66
- lines.push(meta2.join(" · "));
67
- lines.push("");
68
- if (l.summary) {
69
- lines.push(`> ${l.summary}`);
70
- lines.push("");
71
- }
72
- if (l.body && l.body.trim().length > 0) {
73
- lines.push(l.body.trim());
74
- lines.push("");
75
- }
76
- lines.push("---");
77
- lines.push("");
78
- }
79
- return lines.join("\n");
80
- }
81
- //# sourceMappingURL=render.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}