@codemap-ai/core 0.2.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/LICENSE +21 -0
- package/dist/config.d.ts +40 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +229 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/agent-pack-doctor.d.ts +36 -0
- package/dist/lib/agent-pack-doctor.d.ts.map +1 -0
- package/dist/lib/agent-pack-doctor.js +325 -0
- package/dist/lib/agent-pack-doctor.js.map +1 -0
- package/dist/lib/agent-pack-installer.d.ts +35 -0
- package/dist/lib/agent-pack-installer.d.ts.map +1 -0
- package/dist/lib/agent-pack-installer.js +371 -0
- package/dist/lib/agent-pack-installer.js.map +1 -0
- package/dist/lib/agent-pack.d.ts +36 -0
- package/dist/lib/agent-pack.d.ts.map +1 -0
- package/dist/lib/agent-pack.js +119 -0
- package/dist/lib/agent-pack.js.map +1 -0
- package/dist/lib/agent-workflow.d.ts +37 -0
- package/dist/lib/agent-workflow.d.ts.map +1 -0
- package/dist/lib/agent-workflow.js +329 -0
- package/dist/lib/agent-workflow.js.map +1 -0
- package/dist/lib/api-types.d.ts +32 -0
- package/dist/lib/api-types.d.ts.map +1 -0
- package/dist/lib/api-types.js +3 -0
- package/dist/lib/api-types.js.map +1 -0
- package/dist/lib/auto-inject.d.ts +16 -0
- package/dist/lib/auto-inject.d.ts.map +1 -0
- package/dist/lib/auto-inject.js +80 -0
- package/dist/lib/auto-inject.js.map +1 -0
- package/dist/lib/bundled-runtime.d.ts +9 -0
- package/dist/lib/bundled-runtime.d.ts.map +1 -0
- package/dist/lib/bundled-runtime.js +20 -0
- package/dist/lib/bundled-runtime.js.map +1 -0
- package/dist/lib/codemap-api.d.ts +22 -0
- package/dist/lib/codemap-api.d.ts.map +1 -0
- package/dist/lib/codemap-api.js +74 -0
- package/dist/lib/codemap-api.js.map +1 -0
- package/dist/lib/import-health.d.ts +38 -0
- package/dist/lib/import-health.d.ts.map +1 -0
- package/dist/lib/import-health.js +186 -0
- package/dist/lib/import-health.js.map +1 -0
- package/dist/lib/local-index.d.ts +52 -0
- package/dist/lib/local-index.d.ts.map +1 -0
- package/dist/lib/local-index.js +262 -0
- package/dist/lib/local-index.js.map +1 -0
- package/dist/lib/markdown-fence.d.ts +8 -0
- package/dist/lib/markdown-fence.d.ts.map +1 -0
- package/dist/lib/markdown-fence.js +98 -0
- package/dist/lib/markdown-fence.js.map +1 -0
- package/dist/lib/mcp-auth.d.ts +39 -0
- package/dist/lib/mcp-auth.d.ts.map +1 -0
- package/dist/lib/mcp-auth.js +184 -0
- package/dist/lib/mcp-auth.js.map +1 -0
- package/dist/lib/monorepo-root.d.ts +7 -0
- package/dist/lib/monorepo-root.d.ts.map +1 -0
- package/dist/lib/monorepo-root.js +23 -0
- package/dist/lib/monorepo-root.js.map +1 -0
- package/dist/lib/onboarding.d.ts +5 -0
- package/dist/lib/onboarding.d.ts.map +1 -0
- package/dist/lib/onboarding.js +96 -0
- package/dist/lib/onboarding.js.map +1 -0
- package/dist/lib/open-url.d.ts +7 -0
- package/dist/lib/open-url.d.ts.map +1 -0
- package/dist/lib/open-url.js +38 -0
- package/dist/lib/open-url.js.map +1 -0
- package/dist/lib/regex-utils.d.ts +2 -0
- package/dist/lib/regex-utils.d.ts.map +1 -0
- package/dist/lib/regex-utils.js +4 -0
- package/dist/lib/regex-utils.js.map +1 -0
- package/dist/lib/server-instructions.d.ts +2 -0
- package/dist/lib/server-instructions.d.ts.map +1 -0
- package/dist/lib/server-instructions.js +34 -0
- package/dist/lib/server-instructions.js.map +1 -0
- package/dist/lib/session-context.d.ts +2 -0
- package/dist/lib/session-context.d.ts.map +1 -0
- package/dist/lib/session-context.js +40 -0
- package/dist/lib/session-context.js.map +1 -0
- package/dist/lib/session-tracker.d.ts +16 -0
- package/dist/lib/session-tracker.d.ts.map +1 -0
- package/dist/lib/session-tracker.js +32 -0
- package/dist/lib/session-tracker.js.map +1 -0
- package/dist/lib/sqlite-index-store.d.ts +165 -0
- package/dist/lib/sqlite-index-store.d.ts.map +1 -0
- package/dist/lib/sqlite-index-store.js +609 -0
- package/dist/lib/sqlite-index-store.js.map +1 -0
- package/dist/lib/tool-response.d.ts +97 -0
- package/dist/lib/tool-response.d.ts.map +1 -0
- package/dist/lib/tool-response.js +127 -0
- package/dist/lib/tool-response.js.map +1 -0
- package/dist/lib/uuid-schema.d.ts +8 -0
- package/dist/lib/uuid-schema.d.ts.map +1 -0
- package/dist/lib/uuid-schema.js +10 -0
- package/dist/lib/uuid-schema.js.map +1 -0
- package/dist/lib/workspace-git.d.ts +16 -0
- package/dist/lib/workspace-git.d.ts.map +1 -0
- package/dist/lib/workspace-git.js +53 -0
- package/dist/lib/workspace-git.js.map +1 -0
- package/dist/lib/workspace-project.d.ts +61 -0
- package/dist/lib/workspace-project.d.ts.map +1 -0
- package/dist/lib/workspace-project.js +231 -0
- package/dist/lib/workspace-project.js.map +1 -0
- package/dist/lib/workspace-resolver.d.ts +16 -0
- package/dist/lib/workspace-resolver.d.ts.map +1 -0
- package/dist/lib/workspace-resolver.js +59 -0
- package/dist/lib/workspace-resolver.js.map +1 -0
- package/dist/lib/workspace-zip.d.ts +12 -0
- package/dist/lib/workspace-zip.d.ts.map +1 -0
- package/dist/lib/workspace-zip.js +126 -0
- package/dist/lib/workspace-zip.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
const FENCE_LANGUAGE_BY_EXTENSION = {
|
|
2
|
+
bash: "bash",
|
|
3
|
+
c: "c",
|
|
4
|
+
cc: "cpp",
|
|
5
|
+
cjs: "js",
|
|
6
|
+
cpp: "cpp",
|
|
7
|
+
cs: "csharp",
|
|
8
|
+
css: "css",
|
|
9
|
+
dart: "dart",
|
|
10
|
+
go: "go",
|
|
11
|
+
h: "c",
|
|
12
|
+
hpp: "cpp",
|
|
13
|
+
html: "html",
|
|
14
|
+
java: "java",
|
|
15
|
+
js: "js",
|
|
16
|
+
json: "json",
|
|
17
|
+
jsonc: "jsonc",
|
|
18
|
+
jsx: "jsx",
|
|
19
|
+
kt: "kotlin",
|
|
20
|
+
kts: "kotlin",
|
|
21
|
+
md: "md",
|
|
22
|
+
mdx: "mdx",
|
|
23
|
+
mjs: "js",
|
|
24
|
+
php: "php",
|
|
25
|
+
py: "py",
|
|
26
|
+
rb: "ruby",
|
|
27
|
+
rs: "rust",
|
|
28
|
+
sh: "bash",
|
|
29
|
+
sql: "sql",
|
|
30
|
+
swift: "swift",
|
|
31
|
+
toml: "toml",
|
|
32
|
+
ts: "ts",
|
|
33
|
+
tsx: "tsx",
|
|
34
|
+
vue: "vue",
|
|
35
|
+
xml: "xml",
|
|
36
|
+
yaml: "yaml",
|
|
37
|
+
yml: "yaml",
|
|
38
|
+
};
|
|
39
|
+
const FENCE_LANGUAGE_BY_NAME = {
|
|
40
|
+
bash: "bash",
|
|
41
|
+
c: "c",
|
|
42
|
+
"c#": "csharp",
|
|
43
|
+
csharp: "csharp",
|
|
44
|
+
"c++": "cpp",
|
|
45
|
+
cpp: "cpp",
|
|
46
|
+
css: "css",
|
|
47
|
+
dart: "dart",
|
|
48
|
+
go: "go",
|
|
49
|
+
html: "html",
|
|
50
|
+
java: "java",
|
|
51
|
+
javascript: "js",
|
|
52
|
+
js: "js",
|
|
53
|
+
json: "json",
|
|
54
|
+
jsonc: "jsonc",
|
|
55
|
+
kotlin: "kotlin",
|
|
56
|
+
markdown: "md",
|
|
57
|
+
md: "md",
|
|
58
|
+
php: "php",
|
|
59
|
+
python: "py",
|
|
60
|
+
py: "py",
|
|
61
|
+
ruby: "ruby",
|
|
62
|
+
rust: "rust",
|
|
63
|
+
shell: "bash",
|
|
64
|
+
sh: "bash",
|
|
65
|
+
sql: "sql",
|
|
66
|
+
swift: "swift",
|
|
67
|
+
text: "text",
|
|
68
|
+
ts: "ts",
|
|
69
|
+
tsx: "tsx",
|
|
70
|
+
typescript: "ts",
|
|
71
|
+
vue: "vue",
|
|
72
|
+
xml: "xml",
|
|
73
|
+
yaml: "yaml",
|
|
74
|
+
};
|
|
75
|
+
function normalizeExtension(extension) {
|
|
76
|
+
const normalized = extension?.trim().toLowerCase().replace(/^\./, "");
|
|
77
|
+
return normalized || null;
|
|
78
|
+
}
|
|
79
|
+
function extensionFromPath(path) {
|
|
80
|
+
const clean = path?.trim().split("?")[0]?.replace(/^[ab]\//, "");
|
|
81
|
+
const extension = clean?.split(".").pop();
|
|
82
|
+
return normalizeExtension(extension);
|
|
83
|
+
}
|
|
84
|
+
function normalizeLanguage(language) {
|
|
85
|
+
const normalized = language?.trim().toLowerCase();
|
|
86
|
+
return normalized || null;
|
|
87
|
+
}
|
|
88
|
+
export function markdownFenceLanguage(input) {
|
|
89
|
+
const extension = normalizeExtension(input.extension) ?? extensionFromPath(input.path);
|
|
90
|
+
const language = normalizeLanguage(input.language);
|
|
91
|
+
return ((extension ? FENCE_LANGUAGE_BY_EXTENSION[extension] : undefined) ??
|
|
92
|
+
(language ? FENCE_LANGUAGE_BY_NAME[language] : undefined) ??
|
|
93
|
+
"");
|
|
94
|
+
}
|
|
95
|
+
export function markdownFenceStart(input) {
|
|
96
|
+
return `\`\`\`${markdownFenceLanguage(input)}`;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=markdown-fence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-fence.js","sourceRoot":"","sources":["../../src/lib/markdown-fence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { McpAuthClaimResponse, McpAuthMeResponse, McpAuthStatusResponse, McpStartAuthResponse } from "@codemap-ai/shared";
|
|
2
|
+
import { type McpConfigUser, type McpServerConfig } from "../config.js";
|
|
3
|
+
import { type CodeMapClient } from "./codemap-api.js";
|
|
4
|
+
export type StartAuthResponse = McpStartAuthResponse;
|
|
5
|
+
export type AuthStatusResponse = McpAuthStatusResponse;
|
|
6
|
+
export type ClaimAuthResponse = McpAuthClaimResponse;
|
|
7
|
+
export interface WaitForAuthResult {
|
|
8
|
+
authenticated: boolean;
|
|
9
|
+
status: AuthStatusResponse["status"];
|
|
10
|
+
apiUrl: string;
|
|
11
|
+
user: McpConfigUser | null;
|
|
12
|
+
expiresAt: string | null;
|
|
13
|
+
timedOut?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare function startMcpLogin(client: CodeMapClient): Promise<McpStartAuthResponse>;
|
|
16
|
+
export declare function getMcpAuthStatus(client: CodeMapClient, sessionId: string): Promise<McpAuthStatusResponse>;
|
|
17
|
+
export declare function getMcpWhoAmI(client: CodeMapClient): Promise<McpAuthMeResponse>;
|
|
18
|
+
export declare function claimMcpAuthSession(client: CodeMapClient, sessionId: string): Promise<McpAuthClaimResponse>;
|
|
19
|
+
export declare function persistAuthorizedSession(config: McpServerConfig, status: Pick<ClaimAuthResponse, "apiUrl" | "apiKey" | "user">): Promise<void>;
|
|
20
|
+
export declare function pollMcpAuthUntilDone(config: McpServerConfig, sessionId: string, options?: {
|
|
21
|
+
expiresAt?: string | null;
|
|
22
|
+
pollIntervalMs?: number | null;
|
|
23
|
+
maxWaitMs?: number | null;
|
|
24
|
+
}): Promise<WaitForAuthResult>;
|
|
25
|
+
export declare function runLoginFlow(config: McpServerConfig): Promise<{
|
|
26
|
+
openedBrowser: boolean;
|
|
27
|
+
authorizeUrl: string;
|
|
28
|
+
user: McpConfigUser | null;
|
|
29
|
+
apiUrl: string;
|
|
30
|
+
}>;
|
|
31
|
+
export declare function tryOpenLoginBrowser(authorizeUrl: string): Promise<boolean>;
|
|
32
|
+
export declare function waitForLoginAuthorization(config: McpServerConfig, startResponse: StartAuthResponse): Promise<{
|
|
33
|
+
sessionId: string;
|
|
34
|
+
status: "authorized";
|
|
35
|
+
expiresAt: string | null;
|
|
36
|
+
apiUrl: string;
|
|
37
|
+
user: McpConfigUser | null;
|
|
38
|
+
}>;
|
|
39
|
+
//# sourceMappingURL=mcp-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-auth.d.ts","sourceRoot":"","sources":["../../src/lib/mcp-auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,eAAe,EAErB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAG3E,MAAM,MAAM,iBAAiB,GAAG,oBAAoB,CAAC;AACrD,MAAM,MAAM,kBAAkB,GAAG,qBAAqB,CAAC;AACvD,MAAM,MAAM,iBAAiB,GAAG,oBAAoB,CAAC;AAGrD,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAMD,wBAAsB,aAAa,CAAC,MAAM,EAAE,aAAa,iCAQxD;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,kCAI9E;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,aAAa,8BAIvD;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,iCAKjF;AAED,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC,iBAyB9D;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,GACA,OAAO,CAAC,iBAAiB,CAAC,CA0G5B;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,eAAe;;;;;GAYzD;AAED,wBAAsB,mBAAmB,CAAC,YAAY,EAAE,MAAM,oBAO7D;AAED,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,eAAe,EACvB,aAAa,EAAE,iBAAiB;;;;;;GA0BjC"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import { saveGlobalConfig, } from "../config.js";
|
|
3
|
+
import { createCodeMapClient } from "./codemap-api.js";
|
|
4
|
+
import { openUrlInBrowser } from "./open-url.js";
|
|
5
|
+
function sleep(ms) {
|
|
6
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
7
|
+
}
|
|
8
|
+
export async function startMcpLogin(client) {
|
|
9
|
+
return client.request("/mcp/auth/start", {
|
|
10
|
+
method: "POST",
|
|
11
|
+
body: {
|
|
12
|
+
clientName: "CodeMap MCP",
|
|
13
|
+
deviceName: os.hostname(),
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
export async function getMcpAuthStatus(client, sessionId) {
|
|
18
|
+
return client.request("/mcp/auth/status", {
|
|
19
|
+
query: { sessionId },
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
export async function getMcpWhoAmI(client) {
|
|
23
|
+
return client.request("/mcp/auth/me", {
|
|
24
|
+
authRequired: true,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
export async function claimMcpAuthSession(client, sessionId) {
|
|
28
|
+
return client.request("/mcp/auth/claim", {
|
|
29
|
+
method: "POST",
|
|
30
|
+
body: { sessionId },
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
export async function persistAuthorizedSession(config, status) {
|
|
34
|
+
if (!status.apiKey) {
|
|
35
|
+
throw new Error("Cannot persist MCP auth session without an API key.");
|
|
36
|
+
}
|
|
37
|
+
const auth = {
|
|
38
|
+
method: "api_key",
|
|
39
|
+
createdAt: new Date().toISOString(),
|
|
40
|
+
lastValidatedAt: new Date().toISOString(),
|
|
41
|
+
};
|
|
42
|
+
const apiUrl = status.apiUrl || config.apiUrl;
|
|
43
|
+
await saveGlobalConfig({
|
|
44
|
+
globalConfigPath: config.globalConfigPath,
|
|
45
|
+
apiUrl,
|
|
46
|
+
apiToken: status.apiKey,
|
|
47
|
+
user: status.user ?? null,
|
|
48
|
+
auth,
|
|
49
|
+
});
|
|
50
|
+
config.apiUrl = apiUrl;
|
|
51
|
+
config.apiToken = status.apiKey;
|
|
52
|
+
config.user = status.user ?? null;
|
|
53
|
+
config.auth = auth;
|
|
54
|
+
}
|
|
55
|
+
export async function pollMcpAuthUntilDone(config, sessionId, options) {
|
|
56
|
+
// Client created once for the lifetime of this poll loop
|
|
57
|
+
const client = createCodeMapClient(config);
|
|
58
|
+
const pollIntervalMs = options?.pollIntervalMs && options.pollIntervalMs > 0
|
|
59
|
+
? options.pollIntervalMs
|
|
60
|
+
: 2000;
|
|
61
|
+
let effectiveExpiresAt = options?.expiresAt ?? null;
|
|
62
|
+
const startedAtMs = Date.now();
|
|
63
|
+
const maxWaitMs = options?.maxWaitMs !== undefined && options.maxWaitMs !== null
|
|
64
|
+
? Math.max(0, options.maxWaitMs)
|
|
65
|
+
: null;
|
|
66
|
+
while (true) {
|
|
67
|
+
const status = await getMcpAuthStatus(client, sessionId);
|
|
68
|
+
if (!effectiveExpiresAt && status.expiresAt) {
|
|
69
|
+
effectiveExpiresAt = status.expiresAt;
|
|
70
|
+
}
|
|
71
|
+
const expiresAtMs = effectiveExpiresAt
|
|
72
|
+
? new Date(effectiveExpiresAt).getTime()
|
|
73
|
+
: null;
|
|
74
|
+
if (status.status === "authorized") {
|
|
75
|
+
try {
|
|
76
|
+
const claimResult = await claimMcpAuthSession(client, sessionId);
|
|
77
|
+
await persistAuthorizedSession(config, claimResult);
|
|
78
|
+
return {
|
|
79
|
+
authenticated: true,
|
|
80
|
+
status: "authorized",
|
|
81
|
+
apiUrl: claimResult.apiUrl || config.apiUrl,
|
|
82
|
+
user: claimResult.user ?? null,
|
|
83
|
+
expiresAt: claimResult.expiresAt ?? effectiveExpiresAt,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
88
|
+
if (message.includes("already been claimed")) {
|
|
89
|
+
throw new Error("Authorization completed, but the CodeMap MCP API key was already claimed by another client or request.");
|
|
90
|
+
}
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (status.status === "expired") {
|
|
95
|
+
return {
|
|
96
|
+
authenticated: false,
|
|
97
|
+
status: "expired",
|
|
98
|
+
apiUrl: status.apiUrl || config.apiUrl,
|
|
99
|
+
user: status.user ?? null,
|
|
100
|
+
expiresAt: effectiveExpiresAt,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
if (status.status === "denied") {
|
|
104
|
+
return {
|
|
105
|
+
authenticated: false,
|
|
106
|
+
status: "denied",
|
|
107
|
+
apiUrl: status.apiUrl || config.apiUrl,
|
|
108
|
+
user: status.user ?? null,
|
|
109
|
+
expiresAt: effectiveExpiresAt,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
const nowMs = Date.now();
|
|
113
|
+
if (expiresAtMs !== null && nowMs >= expiresAtMs) {
|
|
114
|
+
return {
|
|
115
|
+
authenticated: false,
|
|
116
|
+
status: "expired",
|
|
117
|
+
apiUrl: status.apiUrl || config.apiUrl,
|
|
118
|
+
user: status.user ?? null,
|
|
119
|
+
expiresAt: effectiveExpiresAt,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
if (maxWaitMs !== null && nowMs - startedAtMs >= maxWaitMs) {
|
|
123
|
+
return {
|
|
124
|
+
authenticated: false,
|
|
125
|
+
status: "pending",
|
|
126
|
+
apiUrl: status.apiUrl || config.apiUrl,
|
|
127
|
+
user: status.user ?? null,
|
|
128
|
+
expiresAt: effectiveExpiresAt,
|
|
129
|
+
timedOut: true,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
const sleepMs = Math.min(pollIntervalMs, expiresAtMs !== null ? Math.max(0, expiresAtMs - nowMs) : pollIntervalMs, maxWaitMs !== null
|
|
133
|
+
? Math.max(0, maxWaitMs - (nowMs - startedAtMs))
|
|
134
|
+
: pollIntervalMs);
|
|
135
|
+
if (sleepMs <= 0) {
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
await sleep(sleepMs);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
export async function runLoginFlow(config) {
|
|
142
|
+
const client = createCodeMapClient(config);
|
|
143
|
+
const startResponse = await startMcpLogin(client);
|
|
144
|
+
const openedBrowser = await tryOpenLoginBrowser(startResponse.authorizeUrl);
|
|
145
|
+
const result = await waitForLoginAuthorization(config, startResponse);
|
|
146
|
+
return {
|
|
147
|
+
openedBrowser,
|
|
148
|
+
authorizeUrl: startResponse.authorizeUrl,
|
|
149
|
+
user: result.user ?? null,
|
|
150
|
+
apiUrl: result.apiUrl || config.apiUrl,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
export async function tryOpenLoginBrowser(authorizeUrl) {
|
|
154
|
+
try {
|
|
155
|
+
await openUrlInBrowser(authorizeUrl);
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
export async function waitForLoginAuthorization(config, startResponse) {
|
|
163
|
+
const result = await pollMcpAuthUntilDone(config, startResponse.sessionId, {
|
|
164
|
+
expiresAt: startResponse.expiresAt,
|
|
165
|
+
pollIntervalMs: startResponse.pollIntervalMs,
|
|
166
|
+
});
|
|
167
|
+
if (result.status === "authorized") {
|
|
168
|
+
return {
|
|
169
|
+
sessionId: startResponse.sessionId,
|
|
170
|
+
status: "authorized",
|
|
171
|
+
expiresAt: result.expiresAt,
|
|
172
|
+
apiUrl: result.apiUrl,
|
|
173
|
+
user: result.user,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
if (result.status === "expired") {
|
|
177
|
+
throw new Error("MCP login session expired before authorization completed.");
|
|
178
|
+
}
|
|
179
|
+
if (result.status === "denied") {
|
|
180
|
+
throw new Error("MCP login was denied.");
|
|
181
|
+
}
|
|
182
|
+
throw new Error("MCP login timed out before authorization completed.");
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=mcp-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-auth.js","sourceRoot":"","sources":["../../src/lib/mcp-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AAOzB,OAAO,EAIL,gBAAgB,GACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,mBAAmB,EAAsB,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAgBjD,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAqB;IACvD,OAAO,MAAM,CAAC,OAAO,CAAoB,iBAAiB,EAAE;QAC1D,MAAM,EAAE,MAAM;QACd,IAAI,EAAE;YACJ,UAAU,EAAE,aAAa;YACzB,UAAU,EAAE,EAAE,CAAC,QAAQ,EAAE;SAC1B;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAqB,EAAE,SAAiB;IAC7E,OAAO,MAAM,CAAC,OAAO,CAAqB,kBAAkB,EAAE;QAC5D,KAAK,EAAE,EAAE,SAAS,EAAE;KACrB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAqB;IACtD,OAAO,MAAM,CAAC,OAAO,CAAiB,cAAc,EAAE;QACpD,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAAqB,EAAE,SAAiB;IAChF,OAAO,MAAM,CAAC,OAAO,CAAoB,iBAAiB,EAAE;QAC1D,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,EAAE,SAAS,EAAE;KACpB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,MAAuB,EACvB,MAA6D;IAE7D,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,IAAI,GAAkB;QAC1B,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,eAAe,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAC1C,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;IAE9C,MAAM,gBAAgB,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,MAAM;QACN,QAAQ,EAAE,MAAM,CAAC,MAAM;QACvB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI;QACzB,IAAI;KACL,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC;IAChC,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;IAClC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAuB,EACvB,SAAiB,EACjB,OAIC;IAED,yDAAyD;IACzD,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAE3C,MAAM,cAAc,GAClB,OAAO,EAAE,cAAc,IAAI,OAAO,CAAC,cAAc,GAAG,CAAC;QACnD,CAAC,CAAC,OAAO,CAAC,cAAc;QACxB,CAAC,CAAC,IAAI,CAAC;IACX,IAAI,kBAAkB,GAAG,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC;IACpD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC/B,MAAM,SAAS,GACb,OAAO,EAAE,SAAS,KAAK,SAAS,IAAI,OAAO,CAAC,SAAS,KAAK,IAAI;QAC5D,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC;QAChC,CAAC,CAAC,IAAI,CAAC;IAEX,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACzD,IAAI,CAAC,kBAAkB,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YAC5C,kBAAkB,GAAG,MAAM,CAAC,SAAS,CAAC;QACxC,CAAC;QACD,MAAM,WAAW,GAAG,kBAAkB;YACpC,CAAC,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE;YACxC,CAAC,CAAC,IAAI,CAAC;QAET,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBACjE,MAAM,wBAAwB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;gBAEpD,OAAO;oBACL,aAAa,EAAE,IAAI;oBACnB,MAAM,EAAE,YAAY;oBACpB,MAAM,EAAE,WAAW,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM;oBAC3C,IAAI,EAAE,WAAW,CAAC,IAAI,IAAI,IAAI;oBAC9B,SAAS,EAAE,WAAW,CAAC,SAAS,IAAI,kBAAkB;iBACvD,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAEvE,IAAI,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;oBAC7C,MAAM,IAAI,KAAK,CACb,wGAAwG,CACzG,CAAC;gBACJ,CAAC;gBAED,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,OAAO;gBACL,aAAa,EAAE,KAAK;gBACpB,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM;gBACtC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI;gBACzB,SAAS,EAAE,kBAAkB;aAC9B,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO;gBACL,aAAa,EAAE,KAAK;gBACpB,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM;gBACtC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI;gBACzB,SAAS,EAAE,kBAAkB;aAC9B,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEzB,IAAI,WAAW,KAAK,IAAI,IAAI,KAAK,IAAI,WAAW,EAAE,CAAC;YACjD,OAAO;gBACL,aAAa,EAAE,KAAK;gBACpB,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM;gBACtC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI;gBACzB,SAAS,EAAE,kBAAkB;aAC9B,CAAC;QACJ,CAAC;QAED,IAAI,SAAS,KAAK,IAAI,IAAI,KAAK,GAAG,WAAW,IAAI,SAAS,EAAE,CAAC;YAC3D,OAAO;gBACL,aAAa,EAAE,KAAK;gBACpB,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM;gBACtC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI;gBACzB,SAAS,EAAE,kBAAkB;gBAC7B,QAAQ,EAAE,IAAI;aACf,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CACtB,cAAc,EACd,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,EACxE,SAAS,KAAK,IAAI;YAChB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC;YAChD,CAAC,CAAC,cAAc,CACnB,CAAC;QAEF,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;YACjB,SAAS;QACX,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAuB;IACxD,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,MAAM,mBAAmB,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAEtE,OAAO;QACL,aAAa;QACb,YAAY,EAAE,aAAa,CAAC,YAAY;QACxC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI;QACzB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM;KACvC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,YAAoB;IAC5D,IAAI,CAAC;QACH,MAAM,gBAAgB,CAAC,YAAY,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,MAAuB,EACvB,aAAgC;IAEhC,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,aAAa,CAAC,SAAS,EAAE;QACzE,SAAS,EAAE,aAAa,CAAC,SAAS;QAClC,cAAc,EAAE,aAAa,CAAC,cAAc;KAC7C,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;QACnC,OAAO;YACL,SAAS,EAAE,aAAa,CAAC,SAAS;YAClC,MAAM,EAAE,YAAqB;YAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,IAAI,EAAE,MAAM,CAAC,IAAI;SAClB,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;AACzE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Find the monorepo root directory from a given cwd.
|
|
3
|
+
* Uses @manypkg/get-packages (supports pnpm/yarn/npm/bun workspaces).
|
|
4
|
+
* Falls back to git toplevel, then cwd itself.
|
|
5
|
+
*/
|
|
6
|
+
export declare function findMonorepoRoot(cwd: string): Promise<string>;
|
|
7
|
+
//# sourceMappingURL=monorepo-root.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monorepo-root.d.ts","sourceRoot":"","sources":["../../src/lib/monorepo-root.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAanE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { getPackages } from "@manypkg/get-packages";
|
|
2
|
+
import { spawnSync } from "node:child_process";
|
|
3
|
+
/**
|
|
4
|
+
* Find the monorepo root directory from a given cwd.
|
|
5
|
+
* Uses @manypkg/get-packages (supports pnpm/yarn/npm/bun workspaces).
|
|
6
|
+
* Falls back to git toplevel, then cwd itself.
|
|
7
|
+
*/
|
|
8
|
+
export async function findMonorepoRoot(cwd) {
|
|
9
|
+
try {
|
|
10
|
+
const { rootDir } = await getPackages(cwd);
|
|
11
|
+
return rootDir;
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
// getPackages throws when no package.json found or not a monorepo.
|
|
15
|
+
// Fall back to git toplevel.
|
|
16
|
+
const git = spawnSync("git", ["rev-parse", "--show-toplevel"], {
|
|
17
|
+
encoding: "utf8",
|
|
18
|
+
cwd,
|
|
19
|
+
});
|
|
20
|
+
return git.stdout?.trim() || cwd;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=monorepo-root.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monorepo-root.js","sourceRoot":"","sources":["../../src/lib/monorepo-root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAW;IAChD,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;QAC3C,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,mEAAmE;QACnE,6BAA6B;QAC7B,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC,EAAE;YAC7D,QAAQ,EAAE,MAAM;YAChB,GAAG;SACJ,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC;IACnC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
type OnboardingTarget = "claude" | "cursor" | "codex" | "gemini" | "opencode" | "copilot";
|
|
2
|
+
export declare function buildOnboardingGuide(target: OnboardingTarget | "all"): string;
|
|
3
|
+
export declare function isOnboardingTarget(value: string): value is OnboardingTarget;
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=onboarding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../../src/lib/onboarding.ts"],"names":[],"mappings":"AAAA,KAAK,gBAAgB,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;AAkG1F,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,KAAK,GAAG,MAAM,CAO7E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,gBAAgB,CAE3E"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
const DIVIDER = "─".repeat(50);
|
|
2
|
+
const MCP_JSON_SNIPPET = (key) => [
|
|
3
|
+
` {`,
|
|
4
|
+
` "${key}": {`,
|
|
5
|
+
` "codemap-mcp": {`,
|
|
6
|
+
` "command": "npx",`,
|
|
7
|
+
` "args": ["-y", "@codemap-ai/cli"]`,
|
|
8
|
+
` }`,
|
|
9
|
+
` }`,
|
|
10
|
+
` }`,
|
|
11
|
+
].join("\n");
|
|
12
|
+
const COMMON_STEPS_AFTER_SERVER = [
|
|
13
|
+
"",
|
|
14
|
+
"2. Authenticate",
|
|
15
|
+
" $ codemap login",
|
|
16
|
+
"",
|
|
17
|
+
"3. Verify (inside the editor / agent)",
|
|
18
|
+
" Call: ping → expect reply \"pong\"",
|
|
19
|
+
"",
|
|
20
|
+
"4. Link this project",
|
|
21
|
+
" Call: link_project",
|
|
22
|
+
" (or create_project if no CodeMap project exists yet)",
|
|
23
|
+
"",
|
|
24
|
+
"5. Build local index",
|
|
25
|
+
" Call: refresh_local_index",
|
|
26
|
+
].join("\n");
|
|
27
|
+
const FOOTER = [
|
|
28
|
+
"",
|
|
29
|
+
DIVIDER,
|
|
30
|
+
" Done! For every broad task, start with:",
|
|
31
|
+
" explore_task(task=<description>) when files are unclear",
|
|
32
|
+
DIVIDER,
|
|
33
|
+
].join("\n");
|
|
34
|
+
function guide(title, step1Lines) {
|
|
35
|
+
return [
|
|
36
|
+
DIVIDER,
|
|
37
|
+
` CodeMap MCP — ${title} Setup`,
|
|
38
|
+
DIVIDER,
|
|
39
|
+
"",
|
|
40
|
+
...step1Lines,
|
|
41
|
+
COMMON_STEPS_AFTER_SERVER,
|
|
42
|
+
FOOTER,
|
|
43
|
+
].join("\n");
|
|
44
|
+
}
|
|
45
|
+
const GUIDES = {
|
|
46
|
+
claude: guide("Claude Code", [
|
|
47
|
+
"1. Add MCP server",
|
|
48
|
+
" $ claude mcp add codemap-mcp -- npx -y @codemap-ai/cli",
|
|
49
|
+
]),
|
|
50
|
+
cursor: guide("Cursor", [
|
|
51
|
+
"1. Add MCP server — create or edit .cursor/mcp.json:",
|
|
52
|
+
MCP_JSON_SNIPPET("mcpServers"),
|
|
53
|
+
" Then restart Cursor.",
|
|
54
|
+
]),
|
|
55
|
+
codex: guide("Codex", [
|
|
56
|
+
"1. Add MCP server — add to ~/.codex/config.toml:",
|
|
57
|
+
" [mcp_servers.codemap]",
|
|
58
|
+
" command = \"npx\"",
|
|
59
|
+
" args = [\"-y\", \"@codemap-ai/cli\"]",
|
|
60
|
+
]),
|
|
61
|
+
gemini: guide("Gemini CLI", [
|
|
62
|
+
"1. Add MCP server — edit ~/.gemini/settings.json:",
|
|
63
|
+
MCP_JSON_SNIPPET("mcpServers"),
|
|
64
|
+
]),
|
|
65
|
+
opencode: guide("OpenCode", [
|
|
66
|
+
"1. Add MCP server — edit opencode.json (project root):",
|
|
67
|
+
[
|
|
68
|
+
" {",
|
|
69
|
+
" \"mcp\": {",
|
|
70
|
+
" \"codemap-mcp\": {",
|
|
71
|
+
" \"command\": \"npx\",",
|
|
72
|
+
" \"args\": [\"-y\", \"@codemap-ai/cli\"],",
|
|
73
|
+
" \"enabled\": true",
|
|
74
|
+
" }",
|
|
75
|
+
" }",
|
|
76
|
+
" }",
|
|
77
|
+
].join("\n"),
|
|
78
|
+
]),
|
|
79
|
+
copilot: guide("GitHub Copilot (VS Code)", [
|
|
80
|
+
"1. Add MCP server — create or edit .vscode/mcp.json:",
|
|
81
|
+
MCP_JSON_SNIPPET("servers"),
|
|
82
|
+
" Then reload VS Code (Ctrl+Shift+P → Developer: Reload Window).",
|
|
83
|
+
]),
|
|
84
|
+
};
|
|
85
|
+
export function buildOnboardingGuide(target) {
|
|
86
|
+
if (target === "all") {
|
|
87
|
+
return Object.keys(GUIDES)
|
|
88
|
+
.map((t) => GUIDES[t])
|
|
89
|
+
.join("\n\n");
|
|
90
|
+
}
|
|
91
|
+
return GUIDES[target];
|
|
92
|
+
}
|
|
93
|
+
export function isOnboardingTarget(value) {
|
|
94
|
+
return value in GUIDES;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=onboarding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../src/lib/onboarding.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAE/B,MAAM,gBAAgB,GAAG,CAAC,GAAW,EAAE,EAAE,CACvC;IACE,KAAK;IACL,QAAQ,GAAG,MAAM;IACjB,wBAAwB;IACxB,2BAA2B;IAC3B,2CAA2C;IAC3C,SAAS;IACT,OAAO;IACP,KAAK;CACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEf,MAAM,yBAAyB,GAAG;IAChC,EAAE;IACF,iBAAiB;IACjB,oBAAoB;IACpB,EAAE;IACF,uCAAuC;IACvC,yCAAyC;IACzC,EAAE;IACF,sBAAsB;IACtB,uBAAuB;IACvB,+DAA+D;IAC/D,EAAE;IACF,sBAAsB;IACtB,8BAA8B;CAC/B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,MAAM,GAAG;IACb,EAAE;IACF,OAAO;IACP,2CAA2C;IAC3C,2DAA2D;IAC3D,OAAO;CACR,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,SAAS,KAAK,CAAC,KAAa,EAAE,UAAoB;IAChD,OAAO;QACL,OAAO;QACP,mBAAmB,KAAK,QAAQ;QAChC,OAAO;QACP,EAAE;QACF,GAAG,UAAU;QACb,yBAAyB;QACzB,MAAM;KACP,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,MAAM,GAAqC;IAC/C,MAAM,EAAE,KAAK,CAAC,aAAa,EAAE;QAC3B,mBAAmB;QACnB,2DAA2D;KAC5D,CAAC;IAEF,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE;QACtB,sDAAsD;QACtD,gBAAgB,CAAC,YAAY,CAAC;QAC9B,yBAAyB;KAC1B,CAAC;IAEF,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE;QACpB,kDAAkD;QAClD,yBAAyB;QACzB,qBAAqB;QACrB,wCAAwC;KACzC,CAAC;IAEF,MAAM,EAAE,KAAK,CAAC,YAAY,EAAE;QAC1B,mDAAmD;QACnD,gBAAgB,CAAC,YAAY,CAAC;KAC/B,CAAC;IAEF,QAAQ,EAAE,KAAK,CAAC,UAAU,EAAE;QAC1B,wDAAwD;QACxD;YACE,KAAK;YACL,gBAAgB;YAChB,0BAA0B;YAC1B,+BAA+B;YAC/B,kDAAkD;YAClD,2BAA2B;YAC3B,SAAS;YACT,OAAO;YACP,KAAK;SACN,CAAC,IAAI,CAAC,IAAI,CAAC;KACb,CAAC;IAEF,OAAO,EAAE,KAAK,CAAC,0BAA0B,EAAE;QACzC,sDAAsD;QACtD,gBAAgB,CAAC,SAAS,CAAC;QAC3B,mEAAmE;KACpE,CAAC;CACH,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,MAAgC;IACnE,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAQ,MAAM,CAAC,IAAI,CAAC,MAAM,CAAwB;aAC/C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;aACrB,IAAI,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,OAAO,KAAK,IAAI,MAAM,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function isSupportedUrl(value: string): boolean;
|
|
2
|
+
export declare function getOpenCommand(url: string): {
|
|
3
|
+
command: string;
|
|
4
|
+
args: string[];
|
|
5
|
+
};
|
|
6
|
+
export declare function openUrlInBrowser(url: string): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=open-url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-url.d.ts","sourceRoot":"","sources":["../../src/lib/open-url.ts"],"names":[],"mappings":"AAEA,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,WAO3C;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM;;;EAkBzC;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,iBASjD"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
export function isSupportedUrl(value) {
|
|
3
|
+
try {
|
|
4
|
+
const parsed = new URL(value);
|
|
5
|
+
return parsed.protocol === "http:" || parsed.protocol === "https:";
|
|
6
|
+
}
|
|
7
|
+
catch {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export function getOpenCommand(url) {
|
|
12
|
+
switch (process.platform) {
|
|
13
|
+
case "darwin":
|
|
14
|
+
return {
|
|
15
|
+
command: "open",
|
|
16
|
+
args: [url],
|
|
17
|
+
};
|
|
18
|
+
case "win32":
|
|
19
|
+
return {
|
|
20
|
+
command: "cmd",
|
|
21
|
+
args: ["/c", "start", "", url],
|
|
22
|
+
};
|
|
23
|
+
default:
|
|
24
|
+
return {
|
|
25
|
+
command: "xdg-open",
|
|
26
|
+
args: [url],
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export async function openUrlInBrowser(url) {
|
|
31
|
+
const launcher = getOpenCommand(url);
|
|
32
|
+
const child = spawn(launcher.command, launcher.args, {
|
|
33
|
+
detached: true,
|
|
34
|
+
stdio: "ignore",
|
|
35
|
+
});
|
|
36
|
+
child.unref();
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=open-url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-url.js","sourceRoot":"","sources":["../../src/lib/open-url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9B,OAAO,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,KAAK,QAAQ;YACX,OAAO;gBACL,OAAO,EAAE,MAAM;gBACf,IAAI,EAAE,CAAC,GAAG,CAAC;aACZ,CAAC;QACJ,KAAK,OAAO;YACV,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC;aAC/B,CAAC;QACJ;YACE,OAAO;gBACL,OAAO,EAAE,UAAU;gBACnB,IAAI,EAAE,CAAC,GAAG,CAAC;aACZ,CAAC;IACN,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAW;IAChD,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAErC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE;QACnD,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,QAAQ;KAChB,CAAC,CAAC;IAEH,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regex-utils.d.ts","sourceRoot":"","sources":["../../src/lib/regex-utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regex-utils.js","sourceRoot":"","sources":["../../src/lib/regex-utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,OAAO,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-instructions.d.ts","sourceRoot":"","sources":["../../src/lib/server-instructions.ts"],"names":[],"mappings":"AAAA,wBAAgB,uBAAuB,IAAI,MAAM,CAgChD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export function buildServerInstructions() {
|
|
2
|
+
return `
|
|
3
|
+
You are working in a CodeMap-indexed repository.
|
|
4
|
+
|
|
5
|
+
## MANDATORY WORKFLOW
|
|
6
|
+
|
|
7
|
+
1. BEFORE ANY BROAD TASK WITH UNCLEAR FILES → call \`explore_task(task=<description>)\`.
|
|
8
|
+
2. BEFORE READING FILES → call \`explore_task\` or \`search_codebase\`. Never read files blindly.
|
|
9
|
+
3. BEFORE EDITING HIGH-BLAST FILES (blast_radius ≥ 10) → call \`find_related_files\` first.
|
|
10
|
+
4. AFTER EDITS → call \`diff\` to verify scope, then \`reimport(wait=true)\` if index changed.
|
|
11
|
+
|
|
12
|
+
## TOOL ROUTING (quick reference)
|
|
13
|
+
|
|
14
|
+
| Situation | Tool to call |
|
|
15
|
+
|---|---|
|
|
16
|
+
| New broad task | explore_task → get_file → get_file |
|
|
17
|
+
| "Which files to read?" | find_related_files |
|
|
18
|
+
| Symbol / keyword lookup | search_codebase or symbol |
|
|
19
|
+
| Impact analysis | symbol / symbol |
|
|
20
|
+
| Read specific symbol body | get_file(include=["symbols"], symbol_names=[...]) |
|
|
21
|
+
| Survey file structure | get_file(include=["outline"]) |
|
|
22
|
+
| After edits | diff → reimport(wait=true) |
|
|
23
|
+
|
|
24
|
+
## HARD GATES — never skip
|
|
25
|
+
|
|
26
|
+
- Do NOT grep / cat / read source files before checking CodeMap tools first.
|
|
27
|
+
- Do NOT edit a file with blast_radius ≥ 10 without calling find_related_files first.
|
|
28
|
+
- Do NOT declare a task complete without reviewing diff.
|
|
29
|
+
- Do NOT call get_file(include=["content"]) when include=["symbols"] or include=["outline"] would suffice.
|
|
30
|
+
|
|
31
|
+
Skipping these gates causes missed dependencies, broken imports, and regressions.
|
|
32
|
+
`.trim();
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=server-instructions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-instructions.js","sourceRoot":"","sources":["../../src/lib/server-instructions.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,uBAAuB;IACrC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BR,CAAC,IAAI,EAAE,CAAC;AACT,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-context.d.ts","sourceRoot":"","sources":["../../src/lib/session-context.ts"],"names":[],"mappings":"AAaA,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA8BtE"}
|