@maind-dev/cli 0.3.0 → 0.6.0
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 +50 -0
- package/build/ci-report.js +17 -1
- package/build/ci-report.js.map +1 -1
- package/build/git-context.js +214 -0
- package/build/git-context.js.map +1 -0
- package/build/git.js +133 -0
- package/build/git.js.map +1 -0
- package/build/index-cmd.js +245 -0
- package/build/index-cmd.js.map +1 -0
- package/build/index.js +86 -3
- package/build/index.js.map +1 -1
- package/build/mcp-client.js +4 -0
- package/build/mcp-client.js.map +1 -1
- package/build/review-render.js +231 -0
- package/build/review-render.js.map +1 -0
- package/build/review.js +296 -0
- package/build/review.js.map +1 -0
- package/build/sync-cmd.js +140 -0
- package/build/sync-cmd.js.map +1 -0
- package/package.json +15 -11
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
// `maind index*` — local codebase indexing commands (Codebase Memory, Phase 1).
|
|
2
|
+
//
|
|
3
|
+
// Fully local: builds/reads a tree-sitter → SQLite property graph under
|
|
4
|
+
// `.maind/code-index.sqlite`. No network, no auth, no cloud — the local index is
|
|
5
|
+
// the source of truth (opt-in cloud sync is a later phase). STDOUT carries the
|
|
6
|
+
// pipeable result (or JSON with --json); progress + diagnostics go to STDERR.
|
|
7
|
+
import { execFileSync, spawnSync } from "node:child_process";
|
|
8
|
+
import { existsSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
9
|
+
import { tmpdir } from "node:os";
|
|
10
|
+
import { dirname, join } from "node:path";
|
|
11
|
+
import { fileURLToPath } from "node:url";
|
|
12
|
+
import { createNodeCodeIndex } from "@maind/code-index/node";
|
|
13
|
+
import { createNodeEmbedder } from "@maind/code-index/node-embed";
|
|
14
|
+
// ── ONNX-runtime teardown isolation ──────────────────────────────────────────
|
|
15
|
+
// onnxruntime-node (via @maind/embedding) raises SIGABRT during process teardown
|
|
16
|
+
// on one-shot runs (macOS/Node 22) — after producing correct results. It cannot
|
|
17
|
+
// be caught in-process (process.exit / reallyExit / SIGABRT-handler all still
|
|
18
|
+
// abort). So the ORT-using commands (`index --embed`, `index-semantic`) run in a
|
|
19
|
+
// child process: the parent streams the child's output and exits cleanly,
|
|
20
|
+
// mapping the child's teardown-abort to success via a flag file (a real failure
|
|
21
|
+
// leaves the flag unwritten). The long-running mcp-bridge (Phase 3) never hits
|
|
22
|
+
// this, so this isolation is CLI-only.
|
|
23
|
+
const OK_FILE_ENV = "MAIND_ORT_OK_FILE";
|
|
24
|
+
const WORKER_FLAG = "--_ort-worker";
|
|
25
|
+
const CLI_ENTRY = fileURLToPath(new URL("./index.js", import.meta.url));
|
|
26
|
+
/** True when the current process is the isolated ORT worker. */
|
|
27
|
+
export function isOrtWorker(argv) {
|
|
28
|
+
return argv.includes(WORKER_FLAG);
|
|
29
|
+
}
|
|
30
|
+
/** Re-exec the current command in a child, returning a clean exit code. */
|
|
31
|
+
export function runOrtIsolated(argv) {
|
|
32
|
+
const dir = mkdtempSync(join(tmpdir(), "maind-ort-"));
|
|
33
|
+
const okFile = join(dir, "ok");
|
|
34
|
+
const res = spawnSync(process.execPath, [CLI_ENTRY, ...argv, WORKER_FLAG], {
|
|
35
|
+
stdio: ["ignore", "inherit", "inherit"],
|
|
36
|
+
env: { ...process.env, [OK_FILE_ENV]: okFile },
|
|
37
|
+
});
|
|
38
|
+
const ok = existsSync(okFile);
|
|
39
|
+
try {
|
|
40
|
+
rmSync(dirname(okFile), { recursive: true, force: true });
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// best-effort cleanup
|
|
44
|
+
}
|
|
45
|
+
if (ok)
|
|
46
|
+
return 0;
|
|
47
|
+
return res.status && res.status !== 0 ? res.status : 1;
|
|
48
|
+
}
|
|
49
|
+
/** In the worker, mark success so the parent maps the teardown-abort to exit 0. */
|
|
50
|
+
function markOrtOk() {
|
|
51
|
+
const f = process.env[OK_FILE_ENV];
|
|
52
|
+
if (f) {
|
|
53
|
+
try {
|
|
54
|
+
writeFileSync(f, "ok");
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// best-effort — parent falls back to the child exit code
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function flag(argv, name) {
|
|
62
|
+
return argv.includes(name);
|
|
63
|
+
}
|
|
64
|
+
function value(argv, name) {
|
|
65
|
+
const i = argv.indexOf(name);
|
|
66
|
+
if (i === -1 || i + 1 >= argv.length)
|
|
67
|
+
return undefined;
|
|
68
|
+
return argv[i + 1];
|
|
69
|
+
}
|
|
70
|
+
/** git repo top-level, or cwd if not a repo. */
|
|
71
|
+
function resolveRoot(explicit) {
|
|
72
|
+
if (explicit)
|
|
73
|
+
return explicit;
|
|
74
|
+
try {
|
|
75
|
+
return execFileSync("git", ["rev-parse", "--show-toplevel"], {
|
|
76
|
+
encoding: "utf8",
|
|
77
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
78
|
+
}).trim();
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return process.cwd();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/** Construct the local index with the semantic embedder wired in (CLI wants semantic). */
|
|
85
|
+
function openIndex(opts) {
|
|
86
|
+
return createNodeCodeIndex({
|
|
87
|
+
repoRoot: opts.root,
|
|
88
|
+
dbPath: opts.db ?? undefined,
|
|
89
|
+
embedder: createNodeEmbedder(),
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
function baseOpts(argv) {
|
|
93
|
+
return {
|
|
94
|
+
root: resolveRoot(value(argv, "--root")),
|
|
95
|
+
db: value(argv, "--db") ?? null,
|
|
96
|
+
full: flag(argv, "--full"),
|
|
97
|
+
embed: flag(argv, "--embed"),
|
|
98
|
+
json: flag(argv, "--json"),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
export function parseIndexArgs(argv) {
|
|
102
|
+
return baseOpts(argv);
|
|
103
|
+
}
|
|
104
|
+
export function parseIndexSearchArgs(argv) {
|
|
105
|
+
const positional = argv.find((a) => !a.startsWith("--"));
|
|
106
|
+
const limitRaw = value(argv, "--limit");
|
|
107
|
+
const limit = limitRaw ? Number.parseInt(limitRaw, 10) : 15;
|
|
108
|
+
const kind = value(argv, "--kind");
|
|
109
|
+
return {
|
|
110
|
+
...baseOpts(argv),
|
|
111
|
+
query: positional ?? "",
|
|
112
|
+
kind: kind ?? null,
|
|
113
|
+
limit: Number.isFinite(limit) && limit > 0 ? limit : 15,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
export async function runIndex(opts) {
|
|
117
|
+
const idx = openIndex(opts);
|
|
118
|
+
try {
|
|
119
|
+
const stats = await idx.indexRepository({
|
|
120
|
+
full: opts.full,
|
|
121
|
+
embed: opts.embed,
|
|
122
|
+
onProgress: opts.json
|
|
123
|
+
? undefined
|
|
124
|
+
: (p) => {
|
|
125
|
+
process.stderr.write(`\r ${p.done}/${p.total} ${p.path.slice(0, 60)}`.padEnd(84));
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
if (opts.json) {
|
|
129
|
+
process.stdout.write(JSON.stringify(stats) + "\n");
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
process.stderr.write("\r".padEnd(84) + "\r");
|
|
133
|
+
const extra = opts.embed ? `, ${(await idx.status()).embeddingCount} embeddings` : "";
|
|
134
|
+
process.stdout.write(` ✓ ${stats.filesParsed} parsed · ${stats.filesSkipped} unchanged · ` +
|
|
135
|
+
`${stats.filesDeleted} removed → ${stats.nodeCount} symbols, ${stats.edgeCount} edges ` +
|
|
136
|
+
`(${stats.durationMs}ms${stats.incremental ? ", incremental" : ""}${extra})\n`);
|
|
137
|
+
}
|
|
138
|
+
markOrtOk();
|
|
139
|
+
return 0;
|
|
140
|
+
}
|
|
141
|
+
finally {
|
|
142
|
+
await idx.close();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
export async function runIndexStatus(opts) {
|
|
146
|
+
const idx = openIndex(opts);
|
|
147
|
+
try {
|
|
148
|
+
const status = await idx.status();
|
|
149
|
+
if (opts.json) {
|
|
150
|
+
process.stdout.write(JSON.stringify(status) + "\n");
|
|
151
|
+
return 0;
|
|
152
|
+
}
|
|
153
|
+
if (!status.indexed) {
|
|
154
|
+
process.stdout.write(" not indexed — run `maind index` first.\n");
|
|
155
|
+
return 0;
|
|
156
|
+
}
|
|
157
|
+
const langs = Object.entries(status.languages)
|
|
158
|
+
.map(([l, c]) => `${l}:${c}`)
|
|
159
|
+
.join(" ");
|
|
160
|
+
const when = status.lastIndexedAt
|
|
161
|
+
? new Date(status.lastIndexedAt).toISOString()
|
|
162
|
+
: "—";
|
|
163
|
+
process.stdout.write(` ${status.fileCount} files · ${status.nodeCount} symbols · ${status.edgeCount} edges · ${status.embeddingCount} embeddings\n` +
|
|
164
|
+
` languages: ${langs || "—"}\n` +
|
|
165
|
+
` last indexed: ${when} (commit ${status.lastIndexCommit?.slice(0, 8) ?? "—"}, schema v${status.schemaVersion ?? "—"})\n`);
|
|
166
|
+
return 0;
|
|
167
|
+
}
|
|
168
|
+
finally {
|
|
169
|
+
await idx.close();
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
export async function runIndexSearch(opts) {
|
|
173
|
+
if (!opts.query) {
|
|
174
|
+
process.stderr.write("maind: index-search needs a query. Usage: maind index-search <query> [--kind <k>] [--limit <n>]\n");
|
|
175
|
+
return 2;
|
|
176
|
+
}
|
|
177
|
+
const idx = openIndex(opts);
|
|
178
|
+
try {
|
|
179
|
+
const hits = await idx.searchGraph(opts.query, { kind: opts.kind ?? undefined, limit: opts.limit });
|
|
180
|
+
if (opts.json) {
|
|
181
|
+
process.stdout.write(JSON.stringify(hits) + "\n");
|
|
182
|
+
return 0;
|
|
183
|
+
}
|
|
184
|
+
if (hits.length === 0) {
|
|
185
|
+
process.stdout.write(" no matches.\n");
|
|
186
|
+
return 0;
|
|
187
|
+
}
|
|
188
|
+
for (const h of hits) {
|
|
189
|
+
process.stdout.write(` ${h.kind.padEnd(10)} ${h.qualifiedName} ${h.filePath}:${h.startLine}\n`);
|
|
190
|
+
}
|
|
191
|
+
return 0;
|
|
192
|
+
}
|
|
193
|
+
finally {
|
|
194
|
+
await idx.close();
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
export async function runIndexSemantic(opts) {
|
|
198
|
+
if (!opts.query) {
|
|
199
|
+
process.stderr.write("maind: index-semantic needs a query. Usage: maind index-semantic <query> [--limit <n>]\n");
|
|
200
|
+
return 2;
|
|
201
|
+
}
|
|
202
|
+
const idx = openIndex(opts);
|
|
203
|
+
try {
|
|
204
|
+
const hits = await idx.semanticQuery(opts.query, { limit: opts.limit });
|
|
205
|
+
if (opts.json) {
|
|
206
|
+
process.stdout.write(JSON.stringify(hits) + "\n");
|
|
207
|
+
}
|
|
208
|
+
else if (hits.length === 0) {
|
|
209
|
+
process.stdout.write(" no matches — did you build embeddings? Run 'maind index --embed' first.\n");
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
for (const h of hits) {
|
|
213
|
+
process.stdout.write(` ${(h.score ?? 0).toFixed(3)} ${h.kind.padEnd(10)} ${h.qualifiedName} ${h.filePath}:${h.startLine}\n`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
markOrtOk();
|
|
217
|
+
return 0;
|
|
218
|
+
}
|
|
219
|
+
finally {
|
|
220
|
+
await idx.close();
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
export async function runIndexArch(opts) {
|
|
224
|
+
const idx = openIndex(opts);
|
|
225
|
+
try {
|
|
226
|
+
const arch = await idx.getArchitecture({ topN: 10 });
|
|
227
|
+
if (opts.json) {
|
|
228
|
+
process.stdout.write(JSON.stringify(arch) + "\n");
|
|
229
|
+
return 0;
|
|
230
|
+
}
|
|
231
|
+
const kinds = Object.entries(arch.kindDistribution)
|
|
232
|
+
.map(([k, c]) => `${k}:${c}`)
|
|
233
|
+
.join(" ");
|
|
234
|
+
process.stdout.write(` ${arch.fileCount} files · ${arch.nodeCount} symbols · ${arch.edgeCount} edges\n` +
|
|
235
|
+
` kinds: ${kinds}\n most-imported modules:\n`);
|
|
236
|
+
for (const m of arch.topModules) {
|
|
237
|
+
process.stdout.write(` ${String(m.importsIn).padStart(4)} ← ${m.filePath} (${m.symbolCount} symbols)\n`);
|
|
238
|
+
}
|
|
239
|
+
return 0;
|
|
240
|
+
}
|
|
241
|
+
finally {
|
|
242
|
+
await idx.close();
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=index-cmd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-cmd.js","sourceRoot":"","sources":["../src/index-cmd.ts"],"names":[],"mappings":"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"}
|
package/build/index.js
CHANGED
|
@@ -8,20 +8,59 @@
|
|
|
8
8
|
// MAIND_API_KEY, calls a few read-only maind tools, and writes files.
|
|
9
9
|
//
|
|
10
10
|
// STDOUT is reserved for command results that are meant to be piped; all
|
|
11
|
-
// diagnostics go to STDERR.
|
|
11
|
+
// diagnostics go to STDERR.
|
|
12
12
|
import { parseContextArgs, runContext } from "./context.js";
|
|
13
13
|
import { parseCiReportArgs, runCiReport } from "./ci-report.js";
|
|
14
14
|
import { parseCiResultArgs, runCiResult } from "./ci-result.js";
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
import { parseGitContextArgs, runGitContext } from "./git-context.js";
|
|
16
|
+
import { gatherGitState } from "./git.js";
|
|
17
|
+
import { isOrtWorker, parseIndexArgs, parseIndexSearchArgs, runIndex, runIndexArch, runIndexSearch, runIndexSemantic, runIndexStatus, runOrtIsolated, } from "./index-cmd.js";
|
|
18
|
+
import { parseReviewArgs, runReview } from "./review.js";
|
|
19
|
+
import { parseSyncArgs, runSync } from "./sync-cmd.js";
|
|
20
|
+
const VERSION = "0.6.0";
|
|
21
|
+
const HELP = `maind ${VERSION} — headless maind CLI for CI + git context
|
|
17
22
|
|
|
18
23
|
Usage:
|
|
19
24
|
maind context [options] Pull stack-relevant lessons + conventions into the runner
|
|
25
|
+
maind git-context [options] Briefing of local git state + peers + relevant lessons (session-start)
|
|
26
|
+
maind project-key Print this repo's project_key (sha256) for repo-scoped content
|
|
27
|
+
maind index [--embed] [..] Build/update the local codebase index (--embed builds symbol vectors)
|
|
28
|
+
maind index-status [--json] Show the local index status (files, symbols, edges, embeddings)
|
|
29
|
+
maind index-search <q> [..] Lexical symbol search (--kind <k> --limit <n> --json)
|
|
30
|
+
maind index-semantic <q> [.] Semantic symbol search (needs 'index --embed'; --limit <n> --json)
|
|
31
|
+
maind index-arch [--json] Architecture overview (symbol kinds + most-imported modules)
|
|
32
|
+
maind sync Push the local index to the cloud (opt-in; hashed rows only)
|
|
33
|
+
maind sync status [--json] Show local vs cloud sync state
|
|
34
|
+
maind sync enable|disable Opt in/out of codebase cloud-sync (consent)
|
|
35
|
+
maind review [options] Provenance-backed review findings for a change set (advisory by default)
|
|
20
36
|
maind ci-report [options] Report a CI failure as a draft-lesson candidate (on failure)
|
|
21
37
|
maind ci-result [options] Report a build outcome + served manifest (end of job)
|
|
22
38
|
maind --help Show this help
|
|
23
39
|
maind --version Print version
|
|
24
40
|
|
|
41
|
+
review options (advisory by default — exits 0 unless --gate + --fail-on):
|
|
42
|
+
--base <ref> Review the diff against this git ref (e.g. origin/main)
|
|
43
|
+
--uncommitted With --base: also include uncommitted changes (default without --base)
|
|
44
|
+
--summary <text> Prose change summary — enables index-less review, sharpens hints
|
|
45
|
+
--out <path> Findings report markdown (default .maind/review.md; always written,
|
|
46
|
+
a manifest JSON lands next to it as review.json)
|
|
47
|
+
--comment [<path>] Also write PR-comment markdown (default .maind/review-comment.md);
|
|
48
|
+
line 1 carries the idempotency marker for the workflow to post via gh
|
|
49
|
+
--json Print the review manifest JSON to stdout (pipeable)
|
|
50
|
+
--gate Aggregate findings into a server-side pass|warn|block verdict (Team plan)
|
|
51
|
+
--fail-on block|warn With --gate: exit 1 when the verdict crosses this threshold
|
|
52
|
+
--strict Infra errors exit 2 instead of failing open with exit 0
|
|
53
|
+
--no-report Do not report run counts to maind (reserved; run reporting
|
|
54
|
+
lands with the review_runs ingest in a later release)
|
|
55
|
+
--project-key <hex> Repo project_key override (default: auto-detect from git)
|
|
56
|
+
--mcp-url <url> Override MCP endpoint (default \$MAIND_MCP_URL or production)
|
|
57
|
+
|
|
58
|
+
git-context options (run at session-start; reads local git + gh, all fail-open):
|
|
59
|
+
--out <path> Briefing markdown output (default .maind/git-context.md)
|
|
60
|
+
--manifest <path> Optional structured JSON output (git_context manifest)
|
|
61
|
+
--no-mcp Local git state only — skip peer-conflict + lesson enrichment
|
|
62
|
+
--mcp-url <url> Override MCP endpoint (default \$MAIND_MCP_URL or production)
|
|
63
|
+
|
|
25
64
|
ci-report options (run in an on-failure step; the agent authors the lesson first):
|
|
26
65
|
--lesson <path> Agent-authored lesson markdown (frontmatter + body) — required
|
|
27
66
|
--rationale <text> Why this is a reusable lesson — required
|
|
@@ -31,6 +70,7 @@ ci-report options (run in an on-failure step; the agent authors the lesson first
|
|
|
31
70
|
--remediation <text> Suggested fix
|
|
32
71
|
--logs <path> Optional failure-log file (truncated to 8k)
|
|
33
72
|
--provider <p> CI provider (default github-actions)
|
|
73
|
+
--project-key <hex> Repo project_key for org-private repo-scoping (default: auto-detect from git)
|
|
34
74
|
--report-url <url> Override ingest endpoint (default \$MAIND_REPORT_URL or prod)
|
|
35
75
|
|
|
36
76
|
ci-result options (run at the end of a job, success OR failure):
|
|
@@ -71,6 +111,49 @@ async function main() {
|
|
|
71
111
|
if (cmd === "context") {
|
|
72
112
|
return runContext(parseContextArgs(argv.slice(1)));
|
|
73
113
|
}
|
|
114
|
+
if (cmd === "git-context") {
|
|
115
|
+
return runGitContext(parseGitContextArgs(argv.slice(1)));
|
|
116
|
+
}
|
|
117
|
+
if (cmd === "project-key") {
|
|
118
|
+
// Prints the repo's project_key (sha256 of the normalized remote) for use in
|
|
119
|
+
// repo_keys when authoring repo-scoped org-private content. The raw URL is
|
|
120
|
+
// never printed — only the hash. STDOUT so it can be piped/captured.
|
|
121
|
+
const key = gatherGitState().projectKey;
|
|
122
|
+
if (!key) {
|
|
123
|
+
process.stderr.write("maind: not a git repo with a remote — no project_key.\n");
|
|
124
|
+
return 1;
|
|
125
|
+
}
|
|
126
|
+
process.stdout.write(key + "\n");
|
|
127
|
+
return 0;
|
|
128
|
+
}
|
|
129
|
+
// ONNX-runtime teardown isolation: `index --embed` and `index-semantic` use the
|
|
130
|
+
// embedder, which aborts the process on teardown (see index-cmd.ts). Re-exec
|
|
131
|
+
// them in a child so this process exits cleanly — unless we ARE that child.
|
|
132
|
+
const usesOrt = (cmd === "index" && argv.includes("--embed")) || cmd === "index-semantic";
|
|
133
|
+
if (usesOrt && !isOrtWorker(argv)) {
|
|
134
|
+
return runOrtIsolated(argv);
|
|
135
|
+
}
|
|
136
|
+
if (cmd === "index") {
|
|
137
|
+
return runIndex(parseIndexArgs(argv.slice(1)));
|
|
138
|
+
}
|
|
139
|
+
if (cmd === "index-status") {
|
|
140
|
+
return runIndexStatus(parseIndexArgs(argv.slice(1)));
|
|
141
|
+
}
|
|
142
|
+
if (cmd === "index-search") {
|
|
143
|
+
return runIndexSearch(parseIndexSearchArgs(argv.slice(1)));
|
|
144
|
+
}
|
|
145
|
+
if (cmd === "index-semantic") {
|
|
146
|
+
return runIndexSemantic(parseIndexSearchArgs(argv.slice(1)));
|
|
147
|
+
}
|
|
148
|
+
if (cmd === "index-arch") {
|
|
149
|
+
return runIndexArch(parseIndexArgs(argv.slice(1)));
|
|
150
|
+
}
|
|
151
|
+
if (cmd === "sync") {
|
|
152
|
+
return runSync(parseSyncArgs(argv.slice(1)));
|
|
153
|
+
}
|
|
154
|
+
if (cmd === "review") {
|
|
155
|
+
return runReview(parseReviewArgs(argv.slice(1)));
|
|
156
|
+
}
|
|
74
157
|
if (cmd === "ci-report") {
|
|
75
158
|
return runCiReport(parseCiReportArgs(argv.slice(1)));
|
|
76
159
|
}
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,EAAE;AACF,gCAAgC;AAChC,EAAE;AACF,uEAAuE;AACvE,2EAA2E;AAC3E,gFAAgF;AAChF,sEAAsE;AACtE,EAAE;AACF,yEAAyE;AACzE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,EAAE;AACF,gCAAgC;AAChC,EAAE;AACF,uEAAuE;AACvE,2EAA2E;AAC3E,gFAAgF;AAChF,sEAAsE;AACtE,EAAE;AACF,yEAAyE;AACzE,4BAA4B;AAE5B,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EACL,WAAW,EACX,cAAc,EACd,oBAAoB,EACpB,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAEvD,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,MAAM,IAAI,GAAG,SAAS,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8E5B,CAAC;AAEF,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAEpB,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QAC/D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;QACrC,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;QAC1B,OAAO,aAAa,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;QAC1B,6EAA6E;QAC7E,2EAA2E;QAC3E,qEAAqE;QACrE,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC,UAAU,CAAC;QACxC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;YAChF,OAAO,CAAC,CAAC;QACX,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;QACjC,OAAO,CAAC,CAAC;IACX,CAAC;IACD,gFAAgF;IAChF,6EAA6E;IAC7E,4EAA4E;IAC5E,MAAM,OAAO,GACX,CAAC,GAAG,KAAK,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,GAAG,KAAK,gBAAgB,CAAC;IAC5E,IAAI,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,OAAO,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,GAAG,KAAK,cAAc,EAAE,CAAC;QAC3B,OAAO,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,GAAG,KAAK,cAAc,EAAE,CAAC;QAC3B,OAAO,cAAc,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,GAAG,KAAK,gBAAgB,EAAE,CAAC;QAC7B,OAAO,gBAAgB,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;QACzB,OAAO,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,OAAO,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,OAAO,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;QACxB,OAAO,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;QACxB,OAAO,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,GAAG,0BAA0B,CAAC,CAAC;IAC/E,OAAO,CAAC,CAAC;AACX,CAAC;AAED,IAAI,EAAE;KACH,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAClC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACb,+EAA+E;IAC/E,2EAA2E;IAC3E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/build/mcp-client.js
CHANGED
|
@@ -22,6 +22,7 @@ export class McpClient {
|
|
|
22
22
|
apiKey;
|
|
23
23
|
deviceId;
|
|
24
24
|
clientVersion;
|
|
25
|
+
projectKey;
|
|
25
26
|
sessionId = null;
|
|
26
27
|
nextId = 1;
|
|
27
28
|
initialized = false;
|
|
@@ -29,6 +30,7 @@ export class McpClient {
|
|
|
29
30
|
this.apiKey = cfg.apiKey;
|
|
30
31
|
this.deviceId = cfg.deviceId;
|
|
31
32
|
this.clientVersion = cfg.clientVersion;
|
|
33
|
+
this.projectKey = cfg.projectKey ?? null;
|
|
32
34
|
this.mcpUrl = cfg.mcpUrl ?? process.env.MAIND_MCP_URL ?? DEFAULT_MCP_URL;
|
|
33
35
|
}
|
|
34
36
|
headers() {
|
|
@@ -41,6 +43,8 @@ export class McpClient {
|
|
|
41
43
|
};
|
|
42
44
|
if (this.deviceId)
|
|
43
45
|
h["x-maind-device-id"] = this.deviceId;
|
|
46
|
+
if (this.projectKey)
|
|
47
|
+
h["x-maind-project-key"] = this.projectKey;
|
|
44
48
|
if (this.sessionId)
|
|
45
49
|
h["mcp-session-id"] = this.sessionId;
|
|
46
50
|
return h;
|
package/build/mcp-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../src/mcp-client.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,EAAE;AACF,8EAA8E;AAC9E,6EAA6E;AAC7E,+EAA+E;AAC/E,0EAA0E;AAC1E,EAAE;AACF,4EAA4E;AAC5E,0EAA0E;AAE1E,MAAM,eAAe,GAAG,2BAA2B,CAAC;AACpD,MAAM,aAAa,GAAG,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../src/mcp-client.ts"],"names":[],"mappings":"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"}
|