@zeroheight/mcp-server 1.0.1 → 1.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/CHANGELOG.md +8 -0
- package/README.md +13 -7
- package/dist/api/api.js +6 -0
- package/dist/api/api.js.map +1 -0
- package/dist/api/api.test.js +4 -0
- package/dist/api/api.test.js.map +1 -0
- package/dist/api/errors.js +4 -0
- package/dist/api/errors.js.map +1 -0
- package/dist/api/page.js +7 -2
- package/dist/api/page.js.map +1 -0
- package/dist/api/sentry.js +13 -0
- package/dist/api/sentry.js.map +1 -0
- package/dist/api/styleguide.js +7 -2
- package/dist/api/styleguide.js.map +1 -0
- package/dist/api/types/page.js +4 -0
- package/dist/api/types/page.js.map +1 -0
- package/dist/api/types/styleguide.js +4 -0
- package/dist/api/types/styleguide.js.map +1 -0
- package/dist/common/credentials.js +4 -0
- package/dist/common/credentials.js.map +1 -0
- package/dist/common/errors.js +21 -0
- package/dist/common/errors.js.map +1 -0
- package/dist/common/formatters/page.js +4 -0
- package/dist/common/formatters/page.js.map +1 -0
- package/dist/common/formatters/styleguide.js +33 -17
- package/dist/common/formatters/styleguide.js.map +1 -0
- package/dist/common/formatters/styleguide.test.js +430 -1
- package/dist/common/formatters/styleguide.test.js.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/page.js +4 -0
- package/dist/prompts/page.js.map +1 -0
- package/dist/prompts/styleguide.js +4 -0
- package/dist/prompts/styleguide.js.map +1 -0
- package/dist/resources/page.js +4 -0
- package/dist/resources/page.js.map +1 -0
- package/dist/resources/styleguide.js +4 -0
- package/dist/resources/styleguide.js.map +1 -0
- package/dist/tools/page.js +4 -0
- package/dist/tools/page.js.map +1 -0
- package/dist/tools/styleguide.js +4 -0
- package/dist/tools/styleguide.js.map +1 -0
- package/package.json +7 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
## Release notes
|
|
2
2
|
|
|
3
|
+
## [1.2.0](https://www.npmjs.com/package/@zeroheight/mcp-server/v/1.2.0) - 9th September 2025
|
|
4
|
+
|
|
5
|
+
- Reduce number of tokens used by `get-styleguide-tree`
|
|
6
|
+
|
|
7
|
+
## [1.1.0](https://www.npmjs.com/package/@zeroheight/mcp-server/v/1.1.0) - 20th August 2025
|
|
8
|
+
|
|
9
|
+
- Use Sentry for error tracking
|
|
10
|
+
|
|
3
11
|
## [1.0.1](https://www.npmjs.com/package/@zeroheight/mcp-server/v/1.0.1) - 15th August 2025
|
|
4
12
|
|
|
5
13
|
- Fix startup when executing via npx
|
package/README.md
CHANGED
|
@@ -9,13 +9,15 @@ MCP server for zeroheight
|
|
|
9
9
|
Add to Claude Desktop or VSCode (including Cursor/Windsurf) config:
|
|
10
10
|
|
|
11
11
|
```json
|
|
12
|
-
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
"
|
|
18
|
-
|
|
12
|
+
{
|
|
13
|
+
"mcpServers": {
|
|
14
|
+
"zeroheight-mcp": {
|
|
15
|
+
"command": "npx",
|
|
16
|
+
"args": ["-y", "@zeroheight/mcp-server@latest"],
|
|
17
|
+
"env": {
|
|
18
|
+
"ZEROHEIGHT_ACCESS_TOKEN": "zhat_abc123",
|
|
19
|
+
"ZEROHEIGHT_CLIENT_ID": "zhci_abc123"
|
|
20
|
+
}
|
|
19
21
|
}
|
|
20
22
|
}
|
|
21
23
|
}
|
|
@@ -32,6 +34,10 @@ ZEROHEIGHT_CLIENT_ID="your-client-id"
|
|
|
32
34
|
ZEROHEIGHT_ACCESS_TOKEN="your-access-token"
|
|
33
35
|
```
|
|
34
36
|
|
|
37
|
+
### Telemetry
|
|
38
|
+
|
|
39
|
+
To help improve the experience this MCP server uses Sentry for error tracking. If you don't want to share error data, you can disable it by setting the environment variable `ZEROHEIGHT_MCP_DISABLE_TELEMETRY=true`
|
|
40
|
+
|
|
35
41
|
### Available Tools
|
|
36
42
|
|
|
37
43
|
The server provides these MCP tools:
|
package/dist/api/api.js
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="9e54e77d-f4b5-53d9-b425-9c1de2e1fd16")}catch(e){}}();
|
|
3
|
+
import * as Sentry from "@sentry/node";
|
|
1
4
|
import { IncorrectScopeError, MaxRetriesError, UnauthorizedError, UnknownError, } from "./errors.js";
|
|
2
5
|
import packageJson from "../../package.json" with { type: "json" };
|
|
3
6
|
const API_PATH = "/open_api/v2";
|
|
@@ -67,6 +70,7 @@ export async function request(path, credentials, init, search) {
|
|
|
67
70
|
throw new IncorrectScopeError();
|
|
68
71
|
}
|
|
69
72
|
else {
|
|
73
|
+
Sentry.captureMessage(`Unknown error occurred making request to: ${url}`);
|
|
70
74
|
throw new UnknownError();
|
|
71
75
|
}
|
|
72
76
|
}
|
|
@@ -75,3 +79,5 @@ export async function request(path, credentials, init, search) {
|
|
|
75
79
|
}
|
|
76
80
|
throw new MaxRetriesError();
|
|
77
81
|
}
|
|
82
|
+
//# sourceMappingURL=api.js.map
|
|
83
|
+
//# debugId=9e54e77d-f4b5-53d9-b425-9c1de2e1fd16
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sources":["api/api.ts"],"sourceRoot":"/","sourcesContent":["import * as Sentry from \"@sentry/node\";\nimport {\n IncorrectScopeError,\n MaxRetriesError,\n UnauthorizedError,\n UnknownError,\n} from \"./errors.js\";\n\nimport packageJson from \"../../package.json\" with { type: \"json\" };\n\nimport { Credentials } from \"../common/credentials.js\";\n\nconst API_PATH = \"/open_api/v2\";\nconst USER_AGENT = `zeroheight-mcp-server/${packageJson.version}`;\n\nexport enum ResponseStatus {\n Success = \"success\",\n Error = \"error\",\n Fail = \"fail\",\n}\n\n/**\n * Open API V2 Response format\n */\n\ninterface BaseResponse<T> {\n status: ResponseStatus;\n message: string;\n data: T;\n}\n\ninterface SuccessResponse<T> extends BaseResponse<T> {\n status: ResponseStatus.Success;\n}\n\ninterface FailResponse<T> extends BaseResponse<T> {\n status: ResponseStatus.Fail;\n}\n\ninterface ErrorResponse<T> extends BaseResponse<T> {\n status: ResponseStatus.Error;\n}\n\nexport type APIResponse<S = {}, F = {}, E = {}> =\n | SuccessResponse<S>\n | FailResponse<F>\n | ErrorResponse<E>;\n\n/**\n * Get the correct URL for production of development depending on the environment variable\n */\nexport function getZeroheightURL() {\n if (process.env[\"NODE_ENV\"] === \"dev\") {\n return new URL(\"https://zeroheight.dev\");\n } else {\n return new URL(\"https://zeroheight.com\");\n }\n}\n\nasync function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function request<R>(\n path: string,\n credentials: Credentials,\n init: RequestInit,\n search?: URLSearchParams,\n): Promise<R> {\n const url = getZeroheightURL();\n url.pathname = API_PATH + path;\n if (search) {\n url.search = \"?\" + search.toString();\n }\n\n if (process.env[\"NODE_ENV\"] === \"dev\") {\n process.env[\"NODE_TLS_REJECT_UNAUTHORIZED\"] = \"0\";\n }\n\n const maxRetries = 3;\n let retries = 0;\n\n while (retries < maxRetries) {\n const response = await fetch(url, {\n ...init,\n headers: {\n \"X-API-CLIENT-NAME\": \"mcp-server\",\n \"X-API-CLIENT\": credentials.client,\n \"X-API-KEY\": credentials.token,\n \"X-API-CLIENT-VERSION\": packageJson.version,\n \"User-Agent\": USER_AGENT,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n },\n });\n\n if (response.status === 401) {\n console.error(\"Unauthorized response from API\", {\n response: { status: response.status, body: await response.text() },\n });\n throw new UnauthorizedError();\n } else if (response.status === 429) {\n retries++;\n const responseData = await response.json();\n const waitTime = responseData.data.reset_time * 1000 - Date.now();\n await sleep(waitTime);\n continue;\n } else if (response.status < 200 || response.status >= 300) {\n console.error(\"API request failed\", {\n response: { status: response.status, body: await response.text() },\n });\n\n if (response.status === 403) {\n throw new IncorrectScopeError();\n } else {\n Sentry.captureMessage(\n `Unknown error occurred making request to: ${url}`,\n );\n throw new UnknownError();\n }\n }\n\n const responseJson = await response.json();\n return responseJson;\n }\n\n throw new MaxRetriesError();\n}\n"],"names":[],"mappings":"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","debug_id":"9e54e77d-f4b5-53d9-b425-9c1de2e1fd16"}
|
package/dist/api/api.test.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="e553bd78-9f77-52cf-bf2e-5515e27caa19")}catch(e){}}();
|
|
1
3
|
import { expect, describe, it } from "@rstest/core";
|
|
2
4
|
import { getZeroheightURL } from "./api.js";
|
|
3
5
|
describe("getZeroheightURL", () => {
|
|
@@ -10,3 +12,5 @@ describe("getZeroheightURL", () => {
|
|
|
10
12
|
expect(getZeroheightURL().toString()).toBe("https://zeroheight.com/");
|
|
11
13
|
});
|
|
12
14
|
});
|
|
15
|
+
//# sourceMappingURL=api.test.js.map
|
|
16
|
+
//# debugId=e553bd78-9f77-52cf-bf2e-5515e27caa19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.test.js","sources":["api/api.test.ts"],"sourceRoot":"/","sourcesContent":["import { expect, describe, it } from \"@rstest/core\";\n\nimport { getZeroheightURL } from \"./api.js\";\n\ndescribe(\"getZeroheightURL\", () => {\n it(\"uses local development domain when NODE_ENV is dev\", () => {\n process.env.NODE_ENV = \"dev\";\n expect(getZeroheightURL().toString()).toBe(\"https://zeroheight.dev/\");\n });\n\n it(\"uses local development domain when NODE_ENV is dev\", () => {\n process.env.NODE_ENV = \"production\";\n expect(getZeroheightURL().toString()).toBe(\"https://zeroheight.com/\");\n });\n});\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC;QAC7B,MAAM,CAAC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,YAAY,CAAC;QACpC,MAAM,CAAC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","debug_id":"e553bd78-9f77-52cf-bf2e-5515e27caa19"}
|
package/dist/api/errors.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="57836e5e-d792-53e5-b891-29f50550cf87")}catch(e){}}();
|
|
1
3
|
export class ApiError extends Error {
|
|
2
4
|
constructor(message) {
|
|
3
5
|
super(message);
|
|
@@ -24,3 +26,5 @@ export class MaxRetriesError extends ApiError {
|
|
|
24
26
|
super("Max retries exceeded while calling the zeroheight API");
|
|
25
27
|
}
|
|
26
28
|
}
|
|
29
|
+
//# sourceMappingURL=errors.js.map
|
|
30
|
+
//# debugId=57836e5e-d792-53e5-b891-29f50550cf87
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sources":["api/errors.ts"],"sourceRoot":"/","sourcesContent":["export class ApiError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\nexport class UnauthorizedError extends ApiError {\n constructor() {\n super(\"Unauthorized. Please ensure you have added your credentials.\");\n }\n}\n\nexport class IncorrectScopeError extends ApiError {\n constructor() {\n super(\n \"The authentication token used does not have the correct scope. \\n\\nPlease create a new authentication token with the relevant scopes and then update your credentials.\",\n );\n }\n}\n\nexport class UnknownError extends ApiError {\n constructor() {\n super(\"An unknown error occurred while calling the zeroheight API\");\n }\n}\n\nexport class MaxRetriesError extends ApiError {\n constructor() {\n super(\"Max retries exceeded while calling the zeroheight API\");\n }\n}\n"],"names":[],"mappings":";;AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,QAAQ;IAC7C;QACE,KAAK,CAAC,8DAA8D,CAAC,CAAC;IACxE,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,QAAQ;IAC/C;QACE,KAAK,CACH,wKAAwK,CACzK,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,QAAQ;IACxC;QACE,KAAK,CAAC,4DAA4D,CAAC,CAAC;IACtE,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,QAAQ;IAC3C;QACE,KAAK,CAAC,uDAAuD,CAAC,CAAC;IACjE,CAAC;CACF","debug_id":"57836e5e-d792-53e5-b891-29f50550cf87"}
|
package/dist/api/page.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="68fc5096-144d-5e6d-b61c-8b74d8c06f44")}catch(e){}}();
|
|
1
3
|
import { getCredentialsFromEnvironment } from "../common/credentials.js";
|
|
2
4
|
import { request } from "./api.js";
|
|
3
5
|
import { UnknownError } from "./errors.js";
|
|
6
|
+
import { captureException } from "../common/errors.js";
|
|
4
7
|
export async function listPages(styleguideId, optionalParams = {}) {
|
|
5
8
|
try {
|
|
6
9
|
const credentials = getCredentialsFromEnvironment();
|
|
@@ -20,7 +23,7 @@ export async function listPages(styleguideId, optionalParams = {}) {
|
|
|
20
23
|
throw new UnknownError();
|
|
21
24
|
}
|
|
22
25
|
catch (e) {
|
|
23
|
-
|
|
26
|
+
captureException(e);
|
|
24
27
|
return [];
|
|
25
28
|
}
|
|
26
29
|
}
|
|
@@ -40,7 +43,9 @@ export async function getPage(pageId, optionalParams = {}) {
|
|
|
40
43
|
throw new UnknownError();
|
|
41
44
|
}
|
|
42
45
|
catch (e) {
|
|
43
|
-
|
|
46
|
+
captureException(e);
|
|
44
47
|
return null;
|
|
45
48
|
}
|
|
46
49
|
}
|
|
50
|
+
//# sourceMappingURL=page.js.map
|
|
51
|
+
//# debugId=68fc5096-144d-5e6d-b61c-8b74d8c06f44
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.js","sources":["api/page.ts"],"sourceRoot":"/","sourcesContent":["import { getCredentialsFromEnvironment } from \"../common/credentials.js\";\nimport { APIResponse, request } from \"./api.js\";\nimport { UnknownError } from \"./errors.js\";\nimport { Page, PageListItem } from \"./types/page.js\";\nimport { captureException } from \"../common/errors.js\";\n\ninterface PageListSuccessResponse {\n pages: PageListItem[];\n}\n\ninterface PageListOptionalParams {\n searchTerm: string;\n releaseId: number;\n}\n\nexport async function listPages(\n styleguideId: number,\n optionalParams: Partial<PageListOptionalParams> = {},\n) {\n try {\n const credentials = getCredentialsFromEnvironment();\n const searchParams = new URLSearchParams();\n\n if (optionalParams.releaseId) {\n searchParams.set(\"release_id\", optionalParams.releaseId.toString());\n }\n\n if (optionalParams.searchTerm) {\n searchParams.set(\"search\", optionalParams.searchTerm);\n }\n\n const response = await request<\n APIResponse<PageListSuccessResponse, {}, {}>\n >(\n `/styleguides/${styleguideId}/pages`,\n credentials,\n {\n method: \"GET\",\n },\n searchParams,\n );\n\n if (\"pages\" in response.data) {\n return response.data.pages;\n }\n\n throw new UnknownError();\n } catch (e) {\n captureException(e);\n return [];\n }\n}\n\ninterface PageSuccessResponse {\n page: Page;\n}\n\ninterface PageOptionalParams {\n releaseId: number;\n}\n\nexport async function getPage(\n pageId: number | string,\n optionalParams: Partial<PageOptionalParams> = {},\n) {\n try {\n const credentials = getCredentialsFromEnvironment();\n const searchParams = new URLSearchParams();\n\n if (optionalParams.releaseId) {\n searchParams.set(\"release_id\", optionalParams.releaseId.toString());\n }\n\n const response = await request<APIResponse<PageSuccessResponse, {}, {}>>(\n `/pages/${pageId}`,\n credentials,\n {\n method: \"GET\",\n },\n searchParams,\n );\n\n if (\"page\" in response.data) {\n return response.data.page;\n }\n\n throw new UnknownError();\n } catch (e) {\n captureException(e);\n return null;\n }\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAe,OAAO,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAWvD,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,YAAoB,EACpB,iBAAkD,EAAE;IAEpD,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,6BAA6B,EAAE,CAAC;QACpD,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;QAE3C,IAAI,cAAc,CAAC,SAAS,EAAE,CAAC;YAC7B,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,cAAc,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,IAAI,cAAc,CAAC,UAAU,EAAE,CAAC;YAC9B,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAG5B,gBAAgB,YAAY,QAAQ,EACpC,WAAW,EACX;YACE,MAAM,EAAE,KAAK;SACd,EACD,YAAY,CACb,CAAC;QAEF,IAAI,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC7B,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QAC7B,CAAC;QAED,MAAM,IAAI,YAAY,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAUD,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAuB,EACvB,iBAA8C,EAAE;IAEhD,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,6BAA6B,EAAE,CAAC;QACpD,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;QAE3C,IAAI,cAAc,CAAC,SAAS,EAAE,CAAC;YAC7B,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,cAAc,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAC5B,UAAU,MAAM,EAAE,EAClB,WAAW,EACX;YACE,MAAM,EAAE,KAAK;SACd,EACD,YAAY,CACb,CAAC;QAEF,IAAI,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC5B,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5B,CAAC;QAED,MAAM,IAAI,YAAY,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC","debug_id":"68fc5096-144d-5e6d-b61c-8b74d8c06f44"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="c06c3b2e-b6d8-5f3f-9013-8a88db0d7dba")}catch(e){}}();
|
|
3
|
+
import * as Sentry from "@sentry/node";
|
|
4
|
+
export function initSentry() {
|
|
5
|
+
Sentry.init({
|
|
6
|
+
environment: process.env.NODE_ENV ?? "production",
|
|
7
|
+
dsn: "https://9b10f0a54e8a17a3b19e91d1b7b79a58@o193842.ingest.us.sentry.io/4509842349817856",
|
|
8
|
+
sendDefaultPii: true,
|
|
9
|
+
tracesSampleRate: 1.0,
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=sentry.js.map
|
|
13
|
+
//# debugId=c06c3b2e-b6d8-5f3f-9013-8a88db0d7dba
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sentry.js","sources":["api/sentry.ts"],"sourceRoot":"/","sourcesContent":["import * as Sentry from \"@sentry/node\";\n\nexport function initSentry() {\n Sentry.init({\n environment: process.env.NODE_ENV ?? \"production\",\n dsn: \"https://9b10f0a54e8a17a3b19e91d1b7b79a58@o193842.ingest.us.sentry.io/4509842349817856\",\n sendDefaultPii: true,\n tracesSampleRate: 1.0,\n });\n}\n"],"names":[],"mappings":";;AAAA,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AAEvC,MAAM,UAAU,UAAU;IACxB,MAAM,CAAC,IAAI,CAAC;QACV,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,YAAY;QACjD,GAAG,EAAE,uFAAuF;QAC5F,cAAc,EAAE,IAAI;QACpB,gBAAgB,EAAE,GAAG;KACtB,CAAC,CAAC;AACL,CAAC","debug_id":"c06c3b2e-b6d8-5f3f-9013-8a88db0d7dba"}
|
package/dist/api/styleguide.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="5b3fff8d-e79c-5cdb-a43c-7c332862f945")}catch(e){}}();
|
|
1
3
|
import { request } from "./api.js";
|
|
2
4
|
import { UnknownError } from "./errors.js";
|
|
3
5
|
import { getCredentialsFromEnvironment } from "../common/credentials.js";
|
|
6
|
+
import { captureException } from "../common/errors.js";
|
|
4
7
|
export async function listStyleguides() {
|
|
5
8
|
try {
|
|
6
9
|
const credentials = getCredentialsFromEnvironment();
|
|
@@ -13,7 +16,7 @@ export async function listStyleguides() {
|
|
|
13
16
|
throw new UnknownError();
|
|
14
17
|
}
|
|
15
18
|
catch (e) {
|
|
16
|
-
|
|
19
|
+
captureException(e);
|
|
17
20
|
return [];
|
|
18
21
|
}
|
|
19
22
|
}
|
|
@@ -30,7 +33,9 @@ export async function getStyleguideTree(id) {
|
|
|
30
33
|
throw new UnknownError();
|
|
31
34
|
}
|
|
32
35
|
catch (e) {
|
|
33
|
-
|
|
36
|
+
captureException(e);
|
|
34
37
|
return [];
|
|
35
38
|
}
|
|
36
39
|
}
|
|
40
|
+
//# sourceMappingURL=styleguide.js.map
|
|
41
|
+
//# debugId=5b3fff8d-e79c-5cdb-a43c-7c332862f945
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styleguide.js","sources":["api/styleguide.ts"],"sourceRoot":"/","sourcesContent":["import { APIResponse, request } from \"./api.js\";\nimport { UnknownError } from \"./errors.js\";\nimport { getCredentialsFromEnvironment } from \"../common/credentials.js\";\nimport {\n CategoryNode,\n NavigationNode,\n PageNode,\n Styleguide,\n} from \"./types/styleguide.js\";\nimport { captureException } from \"../common/errors.js\";\n\ninterface StyleguideListSuccessResponse {\n styleguides: Styleguide[];\n}\n\nexport async function listStyleguides() {\n try {\n const credentials = getCredentialsFromEnvironment();\n const response = await request<\n APIResponse<StyleguideListSuccessResponse, {}, {}>\n >(\"/styleguides\", credentials, {\n method: \"GET\",\n });\n\n if (\"styleguides\" in response.data) {\n return response.data.styleguides;\n }\n\n throw new UnknownError();\n } catch (e) {\n captureException(e);\n return [];\n }\n}\n\ninterface SyleguideTreeSuccessResponse {\n tree: (PageNode | CategoryNode | NavigationNode)[];\n}\n\nexport async function getStyleguideTree(id: number) {\n try {\n const credentials = getCredentialsFromEnvironment();\n const response = await request<\n APIResponse<SyleguideTreeSuccessResponse, {}, {}>\n >(`/styleguides/${id}/tree`, credentials, {\n method: \"GET\",\n });\n\n if (\"tree\" in response.data) {\n return response.data.tree;\n }\n\n console.error(response);\n\n throw new UnknownError();\n } catch (e) {\n captureException(e);\n return [];\n }\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAe,OAAO,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AAOzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAMvD,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,6BAA6B,EAAE,CAAC;QACpD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAE5B,cAAc,EAAE,WAAW,EAAE;YAC7B,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;QAEH,IAAI,aAAa,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,OAAO,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;QACnC,CAAC;QAED,MAAM,IAAI,YAAY,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EAAU;IAChD,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,6BAA6B,EAAE,CAAC;QACpD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAE5B,gBAAgB,EAAE,OAAO,EAAE,WAAW,EAAE;YACxC,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;QAEH,IAAI,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC5B,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5B,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAExB,MAAM,IAAI,YAAY,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC","debug_id":"5b3fff8d-e79c-5cdb-a43c-7c332862f945"}
|
package/dist/api/types/page.js
CHANGED
|
@@ -1 +1,5 @@
|
|
|
1
|
+
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="643b0932-fd2e-5183-ac01-b4b9e2c89e93")}catch(e){}}();
|
|
1
3
|
export {};
|
|
4
|
+
//# sourceMappingURL=page.js.map
|
|
5
|
+
//# debugId=643b0932-fd2e-5183-ac01-b4b9e2c89e93
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.js","sources":["api/types/page.ts"],"sourceRoot":"/","sourcesContent":["export interface PageListItem {\n id: number;\n name: string;\n hidden: boolean;\n created_at: string;\n updated_at: string;\n}\n\nexport interface Tab {\n name: string;\n hidden: boolean;\n order: number;\n uid: string;\n url: string;\n content: string;\n}\n\nexport interface PageStatus {\n id: string;\n name: string;\n}\n\nexport interface Page {\n id: number;\n uid: string;\n slug: string;\n url: string;\n name: string;\n introduction: string;\n hidden: boolean;\n locked: boolean;\n created_at: string;\n updated_at: string;\n status: PageStatus | null;\n tabs?: Tab[];\n content?: string;\n}\n"],"names":[],"mappings":"","debug_id":"643b0932-fd2e-5183-ac01-b4b9e2c89e93"}
|
|
@@ -1 +1,5 @@
|
|
|
1
|
+
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="283f262f-07ce-53a3-a308-d9a435af34ac")}catch(e){}}();
|
|
1
3
|
export {};
|
|
4
|
+
//# sourceMappingURL=styleguide.js.map
|
|
5
|
+
//# debugId=283f262f-07ce-53a3-a308-d9a435af34ac
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styleguide.js","sources":["api/types/styleguide.ts"],"sourceRoot":"/","sourcesContent":["export interface Styleguide {\n id: number;\n name: string;\n team_id: number;\n project_id?: number;\n share_id: string;\n}\n\nexport interface TreeNode {\n id: number;\n type: string;\n name: string;\n hidden: boolean;\n children: NodeType[];\n}\n\nexport interface CategoryNode extends TreeNode {\n type: \"category\";\n}\n\nexport interface PageNode extends TreeNode {\n type: \"page\";\n url: string;\n category_overview_page: boolean;\n}\n\nexport interface NavigationNode extends TreeNode {\n type: \"navigation\";\n}\n\nexport interface TabNode extends TreeNode {\n type: \"tab\";\n url: string;\n}\n\nexport type NodeType = CategoryNode | PageNode | NavigationNode | TabNode;\n"],"names":[],"mappings":"","debug_id":"283f262f-07ce-53a3-a308-d9a435af34ac"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="bd902a01-6689-54db-8a4a-c19f8a5984bf")}catch(e){}}();
|
|
1
3
|
import { MissingCredentialsError } from "./errors.js";
|
|
2
4
|
export function getCredentialsFromEnvironment() {
|
|
3
5
|
const token = process.env["ZEROHEIGHT_ACCESS_TOKEN"];
|
|
@@ -10,3 +12,5 @@ export function getCredentialsFromEnvironment() {
|
|
|
10
12
|
client,
|
|
11
13
|
};
|
|
12
14
|
}
|
|
15
|
+
//# sourceMappingURL=credentials.js.map
|
|
16
|
+
//# debugId=bd902a01-6689-54db-8a4a-c19f8a5984bf
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sources":["common/credentials.ts"],"sourceRoot":"/","sourcesContent":["import { MissingCredentialsError } from \"./errors.js\";\n\nexport interface Credentials {\n token: string;\n client: string;\n}\n\nexport function getCredentialsFromEnvironment(): Credentials {\n const token = process.env[\"ZEROHEIGHT_ACCESS_TOKEN\"];\n const client = process.env[\"ZEROHEIGHT_CLIENT_ID\"];\n if (!token || !client) {\n throw new MissingCredentialsError();\n }\n\n return {\n token,\n client,\n };\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAOtD,MAAM,UAAU,6BAA6B;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACnD,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,IAAI,uBAAuB,EAAE,CAAC;IACtC,CAAC;IAED,OAAO;QACL,KAAK;QACL,MAAM;KACP,CAAC;AACJ,CAAC","debug_id":"bd902a01-6689-54db-8a4a-c19f8a5984bf"}
|
package/dist/common/errors.js
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="a001728d-e5ec-54ad-a52d-85c9ab555aaf")}catch(e){}}();
|
|
3
|
+
import * as Sentry from "@sentry/node";
|
|
1
4
|
export class ServerError extends Error {
|
|
2
5
|
constructor(message) {
|
|
3
6
|
super(message);
|
|
@@ -9,3 +12,21 @@ export class MissingCredentialsError extends ServerError {
|
|
|
9
12
|
super("Missing credentials. Please ensure ZEROHEIGHT_CLIENT_ID and ZEROHEIGHT_ACCESS_TOKEN are set in your environment");
|
|
10
13
|
}
|
|
11
14
|
}
|
|
15
|
+
export function captureException(exception) {
|
|
16
|
+
const disableTelemetry = process.env["ZEROHEIGHT_MCP_DISABLE_TELEMETRY"];
|
|
17
|
+
if (disableTelemetry) {
|
|
18
|
+
console.error(exception);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
Sentry.captureException(exception);
|
|
22
|
+
}
|
|
23
|
+
export function captureMessage(message, context) {
|
|
24
|
+
const disableTelemetry = process.env["ZEROHEIGHT_MCP_DISABLE_TELEMETRY"];
|
|
25
|
+
if (disableTelemetry) {
|
|
26
|
+
console.error(`${message}: ${JSON.stringify(context)}`);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
Sentry.captureMessage(message, context);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=errors.js.map
|
|
32
|
+
//# debugId=a001728d-e5ec-54ad-a52d-85c9ab555aaf
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sources":["common/errors.ts"],"sourceRoot":"/","sourcesContent":["import { CaptureContext } from \"@sentry/core\";\nimport * as Sentry from \"@sentry/node\";\n\nexport class ServerError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ServerError\";\n }\n}\n\nexport class MissingCredentialsError extends ServerError {\n constructor() {\n super(\n \"Missing credentials. Please ensure ZEROHEIGHT_CLIENT_ID and ZEROHEIGHT_ACCESS_TOKEN are set in your environment\",\n );\n }\n}\n\nexport function captureException(exception: unknown) {\n const disableTelemetry = process.env[\"ZEROHEIGHT_MCP_DISABLE_TELEMETRY\"];\n if (disableTelemetry) {\n console.error(exception);\n return;\n }\n\n Sentry.captureException(exception);\n}\n\nexport function captureMessage(message: string, context?: CaptureContext) {\n const disableTelemetry = process.env[\"ZEROHEIGHT_MCP_DISABLE_TELEMETRY\"];\n if (disableTelemetry) {\n console.error(`${message}: ${JSON.stringify(context)}`);\n return;\n }\n\n Sentry.captureMessage(message, context);\n}\n"],"names":[],"mappings":";;AACA,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AAEvC,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,WAAW;IACtD;QACE,KAAK,CACH,iHAAiH,CAClH,CAAC;IACJ,CAAC;CACF;AAED,MAAM,UAAU,gBAAgB,CAAC,SAAkB;IACjD,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IACzE,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACzB,OAAO;IACT,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,OAAwB;IACtE,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IACzE,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxD,OAAO;IACT,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC","debug_id":"a001728d-e5ec-54ad-a52d-85c9ab555aaf"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="3cd31da1-6a6d-5ca8-99b7-244857320b05")}catch(e){}}();
|
|
1
3
|
export function formatPageAsMarkdown(page) {
|
|
2
4
|
const content = page.content ||
|
|
3
5
|
page.tabs?.map((tab) => `## ${tab.name}\n${tab.content}\n---\n`).join("\n");
|
|
@@ -14,3 +16,5 @@ export function formatPageListItemsAsMarkdown(pages) {
|
|
|
14
16
|
.map((page) => `- ${page.name ?? "Untitled page"} (ID: ${page.id})`)
|
|
15
17
|
.join("\n");
|
|
16
18
|
}
|
|
19
|
+
//# sourceMappingURL=page.js.map
|
|
20
|
+
//# debugId=3cd31da1-6a6d-5ca8-99b7-244857320b05
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.js","sources":["common/formatters/page.ts"],"sourceRoot":"/","sourcesContent":["import { Page, PageListItem } from \"../../api/types/page.js\";\n\nexport function formatPageAsMarkdown(page: Page): string {\n const content =\n page.content ||\n page.tabs?.map((tab) => `## ${tab.name}\\n${tab.content}\\n---\\n`).join(\"\\n\");\n return [\n `# ${page.name}`,\n `[Web URL](${page.url})`,\n page.introduction,\n \"\\n\",\n content,\n ].join(\"\\n\");\n}\n\nexport function formatPageListItemsAsMarkdown(pages: PageListItem[]): string {\n return pages\n .map((page) => `- ${page.name ?? \"Untitled page\"} (ID: ${page.id})`)\n .join(\"\\n\");\n}\n"],"names":[],"mappings":";;AAEA,MAAM,UAAU,oBAAoB,CAAC,IAAU;IAC7C,MAAM,OAAO,GACX,IAAI,CAAC,OAAO;QACZ,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9E,OAAO;QACL,KAAK,IAAI,CAAC,IAAI,EAAE;QAChB,aAAa,IAAI,CAAC,GAAG,GAAG;QACxB,IAAI,CAAC,YAAY;QACjB,IAAI;QACJ,OAAO;KACR,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,KAAqB;IACjE,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,eAAe,SAAS,IAAI,CAAC,EAAE,GAAG,CAAC;SACnE,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC","debug_id":"3cd31da1-6a6d-5ca8-99b7-244857320b05"}
|
|
@@ -1,25 +1,41 @@
|
|
|
1
|
+
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="e119b376-ad17-5fb4-a522-859a0d32ee68")}catch(e){}}();
|
|
1
3
|
export const DEFAULT_NAME = "Unnamed styleguide";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
4
|
+
function getUniqueName(baseName, existingKeys) {
|
|
5
|
+
if (!existingKeys[baseName]) {
|
|
6
|
+
return baseName;
|
|
7
|
+
}
|
|
8
|
+
let counter = 1;
|
|
9
|
+
while (existingKeys[`${baseName} ${counter}`]) {
|
|
10
|
+
counter++;
|
|
11
|
+
}
|
|
12
|
+
return `${baseName} ${counter}`;
|
|
13
|
+
}
|
|
14
|
+
function processNode(node, parent) {
|
|
15
|
+
node.children?.forEach((child) => {
|
|
16
|
+
const childName = getUniqueName(child.name || child.type, parent);
|
|
17
|
+
if (child.type === "page") {
|
|
18
|
+
parent[childName] = { id: child.id, url: child.url };
|
|
19
|
+
}
|
|
20
|
+
else if (["category", "navigation"].includes(child.type)) {
|
|
21
|
+
parent[childName] = parent[childName] || {};
|
|
22
|
+
processNode(child, parent[childName]);
|
|
12
23
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
export function formatTreeAsJson(tree) {
|
|
27
|
+
const result = { tree: {} };
|
|
28
|
+
tree.forEach((node) => {
|
|
29
|
+
const baseName = getUniqueName(node.name || node.type, result.tree);
|
|
30
|
+
result.tree[baseName] = result.tree[baseName] || {};
|
|
31
|
+
processNode(node, result.tree[baseName]);
|
|
32
|
+
});
|
|
33
|
+
return result.tree;
|
|
20
34
|
}
|
|
21
35
|
export function formatStyleguideListAsMarkdown(styleguides) {
|
|
22
36
|
return styleguides
|
|
23
37
|
.map((styleguide) => `- ${styleguide.name ?? DEFAULT_NAME} (ID: ${styleguide.id})`)
|
|
24
38
|
.join("\n");
|
|
25
39
|
}
|
|
40
|
+
//# sourceMappingURL=styleguide.js.map
|
|
41
|
+
//# debugId=e119b376-ad17-5fb4-a522-859a0d32ee68
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styleguide.js","sources":["common/formatters/styleguide.ts"],"sourceRoot":"/","sourcesContent":["import { NodeType, Styleguide } from \"../../api/types/styleguide.js\";\n\nexport const DEFAULT_NAME = \"Unnamed styleguide\";\n\ninterface PageNode {\n id: number;\n url: string;\n}\n\ntype HierarchicalNode = {\n [key: string]: PageNode | HierarchicalNode;\n};\n\ninterface ConvertedTree {\n tree: HierarchicalNode;\n}\n\nfunction getUniqueName(\n baseName: string,\n existingKeys: Record<string, any>,\n): string {\n if (!existingKeys[baseName]) {\n return baseName;\n }\n\n let counter = 1;\n while (existingKeys[`${baseName} ${counter}`]) {\n counter++;\n }\n return `${baseName} ${counter}`;\n}\n\nfunction processNode(node: NodeType, parent: HierarchicalNode) {\n node.children?.forEach((child) => {\n const childName = getUniqueName(child.name || child.type, parent);\n\n if (child.type === \"page\") {\n parent[childName] = { id: child.id, url: child.url };\n } else if ([\"category\", \"navigation\"].includes(child.type)) {\n parent[childName] = parent[childName] || {};\n processNode(child, parent[childName] as HierarchicalNode);\n }\n });\n}\n\nexport function formatTreeAsJson(tree: NodeType[]): Record<string, any> {\n const result: ConvertedTree = { tree: {} };\n\n tree.forEach((node) => {\n const baseName = getUniqueName(node.name || node.type, result.tree);\n\n result.tree[baseName] = result.tree[baseName] || {};\n processNode(node, result.tree[baseName] as HierarchicalNode);\n });\n\n return result.tree;\n}\n\nexport function formatStyleguideListAsMarkdown(\n styleguides: Styleguide[],\n): string {\n return styleguides\n .map(\n (styleguide) =>\n `- ${styleguide.name ?? DEFAULT_NAME} (ID: ${styleguide.id})`,\n )\n .join(\"\\n\");\n}\n"],"names":[],"mappings":";;AAEA,MAAM,CAAC,MAAM,YAAY,GAAG,oBAAoB,CAAC;AAejD,SAAS,aAAa,CACpB,QAAgB,EAChB,YAAiC;IAEjC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,OAAO,YAAY,CAAC,GAAG,QAAQ,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC;QAC9C,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,GAAG,QAAQ,IAAI,OAAO,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,WAAW,CAAC,IAAc,EAAE,MAAwB;IAC3D,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC/B,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAElE,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;QACvD,CAAC;aAAM,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3D,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YAC5C,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,CAAqB,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAgB;IAC/C,MAAM,MAAM,GAAkB,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAE3C,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACpB,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAEpE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpD,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAqB,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,WAAyB;IAEzB,OAAO,WAAW;SACf,GAAG,CACF,CAAC,UAAU,EAAE,EAAE,CACb,KAAK,UAAU,CAAC,IAAI,IAAI,YAAY,SAAS,UAAU,CAAC,EAAE,GAAG,CAChE;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC","debug_id":"e119b376-ad17-5fb4-a522-859a0d32ee68"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="a1566a24-9938-599b-a8a8-1237e4dbc1d7")}catch(e){}}();
|
|
1
3
|
import { expect, describe, it } from "@rstest/core";
|
|
2
|
-
import { formatStyleguideListAsMarkdown } from "./styleguide.js";
|
|
4
|
+
import { formatStyleguideListAsMarkdown, formatTreeAsJson, } from "./styleguide.js";
|
|
3
5
|
describe("formatStyleguideListAsMarkdown", () => {
|
|
4
6
|
describe("when list is empty", () => {
|
|
5
7
|
it("returns an empty string", () => {
|
|
@@ -22,3 +24,430 @@ describe("formatStyleguideListAsMarkdown", () => {
|
|
|
22
24
|
});
|
|
23
25
|
});
|
|
24
26
|
});
|
|
27
|
+
describe("formatTreeAsJson", () => {
|
|
28
|
+
describe("when tree is empty", () => {
|
|
29
|
+
it("returns an empty object", () => {
|
|
30
|
+
expect(formatTreeAsJson([])).toEqual({});
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
describe("when tree has a single page node", () => {
|
|
34
|
+
it("creates nested structure with page info", () => {
|
|
35
|
+
const tree = [
|
|
36
|
+
{
|
|
37
|
+
id: 1,
|
|
38
|
+
type: "category",
|
|
39
|
+
name: "Documentation",
|
|
40
|
+
hidden: false,
|
|
41
|
+
children: [
|
|
42
|
+
{
|
|
43
|
+
id: 2,
|
|
44
|
+
type: "page",
|
|
45
|
+
name: "Getting Started",
|
|
46
|
+
url: "/docs/getting-started",
|
|
47
|
+
hidden: false,
|
|
48
|
+
children: [],
|
|
49
|
+
category_overview_page: false,
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
},
|
|
53
|
+
];
|
|
54
|
+
const result = formatTreeAsJson(tree);
|
|
55
|
+
expect(result).toEqual({
|
|
56
|
+
Documentation: {
|
|
57
|
+
"Getting Started": {
|
|
58
|
+
id: 2,
|
|
59
|
+
url: "/docs/getting-started",
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe("when tree has multiple categories", () => {
|
|
66
|
+
it("creates nested structure for each category", () => {
|
|
67
|
+
const tree = [
|
|
68
|
+
{
|
|
69
|
+
id: 1,
|
|
70
|
+
type: "category",
|
|
71
|
+
name: "API",
|
|
72
|
+
hidden: false,
|
|
73
|
+
children: [
|
|
74
|
+
{
|
|
75
|
+
id: 2,
|
|
76
|
+
type: "page",
|
|
77
|
+
name: "REST API",
|
|
78
|
+
url: "/api/rest",
|
|
79
|
+
hidden: false,
|
|
80
|
+
children: [],
|
|
81
|
+
category_overview_page: false,
|
|
82
|
+
},
|
|
83
|
+
],
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
id: 3,
|
|
87
|
+
type: "category",
|
|
88
|
+
name: "Guides",
|
|
89
|
+
hidden: false,
|
|
90
|
+
children: [
|
|
91
|
+
{
|
|
92
|
+
id: 4,
|
|
93
|
+
type: "page",
|
|
94
|
+
name: "Tutorial",
|
|
95
|
+
url: "/guides/tutorial",
|
|
96
|
+
hidden: false,
|
|
97
|
+
children: [],
|
|
98
|
+
category_overview_page: false,
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
},
|
|
102
|
+
];
|
|
103
|
+
const result = formatTreeAsJson(tree);
|
|
104
|
+
expect(result).toEqual({
|
|
105
|
+
API: {
|
|
106
|
+
"REST API": {
|
|
107
|
+
id: 2,
|
|
108
|
+
url: "/api/rest",
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
Guides: {
|
|
112
|
+
Tutorial: {
|
|
113
|
+
id: 4,
|
|
114
|
+
url: "/guides/tutorial",
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
describe("when tree has nested categories", () => {
|
|
121
|
+
it("creates deeply nested structure", () => {
|
|
122
|
+
const tree = [
|
|
123
|
+
{
|
|
124
|
+
id: 1,
|
|
125
|
+
type: "category",
|
|
126
|
+
name: "Documentation",
|
|
127
|
+
hidden: false,
|
|
128
|
+
children: [
|
|
129
|
+
{
|
|
130
|
+
id: 2,
|
|
131
|
+
type: "category",
|
|
132
|
+
name: "API",
|
|
133
|
+
hidden: false,
|
|
134
|
+
children: [
|
|
135
|
+
{
|
|
136
|
+
id: 3,
|
|
137
|
+
type: "page",
|
|
138
|
+
name: "Reference",
|
|
139
|
+
url: "/docs/api/reference",
|
|
140
|
+
hidden: false,
|
|
141
|
+
children: [],
|
|
142
|
+
category_overview_page: false,
|
|
143
|
+
},
|
|
144
|
+
],
|
|
145
|
+
},
|
|
146
|
+
],
|
|
147
|
+
},
|
|
148
|
+
];
|
|
149
|
+
const result = formatTreeAsJson(tree);
|
|
150
|
+
expect(result).toEqual({
|
|
151
|
+
Documentation: {
|
|
152
|
+
API: {
|
|
153
|
+
Reference: {
|
|
154
|
+
id: 3,
|
|
155
|
+
url: "/docs/api/reference",
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
describe("when tree has navigation nodes", () => {
|
|
163
|
+
it("processes navigation nodes and their children", () => {
|
|
164
|
+
const tree = [
|
|
165
|
+
{
|
|
166
|
+
id: 1,
|
|
167
|
+
type: "navigation",
|
|
168
|
+
name: "Main Nav",
|
|
169
|
+
hidden: false,
|
|
170
|
+
children: [
|
|
171
|
+
{
|
|
172
|
+
id: 2,
|
|
173
|
+
type: "page",
|
|
174
|
+
name: "Home",
|
|
175
|
+
url: "/home",
|
|
176
|
+
hidden: false,
|
|
177
|
+
children: [],
|
|
178
|
+
category_overview_page: false,
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
id: 3,
|
|
182
|
+
type: "category",
|
|
183
|
+
name: "Products",
|
|
184
|
+
hidden: false,
|
|
185
|
+
children: [
|
|
186
|
+
{
|
|
187
|
+
id: 4,
|
|
188
|
+
type: "page",
|
|
189
|
+
name: "Product A",
|
|
190
|
+
url: "/products/a",
|
|
191
|
+
hidden: false,
|
|
192
|
+
children: [],
|
|
193
|
+
category_overview_page: false,
|
|
194
|
+
},
|
|
195
|
+
],
|
|
196
|
+
},
|
|
197
|
+
],
|
|
198
|
+
},
|
|
199
|
+
];
|
|
200
|
+
const result = formatTreeAsJson(tree);
|
|
201
|
+
expect(result).toEqual({
|
|
202
|
+
"Main Nav": {
|
|
203
|
+
Home: {
|
|
204
|
+
id: 2,
|
|
205
|
+
url: "/home",
|
|
206
|
+
},
|
|
207
|
+
Products: {
|
|
208
|
+
"Product A": {
|
|
209
|
+
id: 4,
|
|
210
|
+
url: "/products/a",
|
|
211
|
+
},
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
describe("when nodes have duplicate names", () => {
|
|
218
|
+
it("appends numbers to make names unique", () => {
|
|
219
|
+
const tree = [
|
|
220
|
+
{
|
|
221
|
+
id: 1,
|
|
222
|
+
type: "category",
|
|
223
|
+
name: "Docs",
|
|
224
|
+
hidden: false,
|
|
225
|
+
children: [
|
|
226
|
+
{
|
|
227
|
+
id: 2,
|
|
228
|
+
type: "page",
|
|
229
|
+
name: "Overview",
|
|
230
|
+
url: "/docs/overview1",
|
|
231
|
+
hidden: false,
|
|
232
|
+
children: [],
|
|
233
|
+
category_overview_page: false,
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
id: 3,
|
|
237
|
+
type: "page",
|
|
238
|
+
name: "Overview",
|
|
239
|
+
url: "/docs/overview2",
|
|
240
|
+
hidden: false,
|
|
241
|
+
children: [],
|
|
242
|
+
category_overview_page: false,
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
id: 4,
|
|
246
|
+
type: "page",
|
|
247
|
+
name: "Overview",
|
|
248
|
+
url: "/docs/overview3",
|
|
249
|
+
hidden: false,
|
|
250
|
+
children: [],
|
|
251
|
+
category_overview_page: false,
|
|
252
|
+
},
|
|
253
|
+
],
|
|
254
|
+
},
|
|
255
|
+
];
|
|
256
|
+
const result = formatTreeAsJson(tree);
|
|
257
|
+
expect(result).toEqual({
|
|
258
|
+
Docs: {
|
|
259
|
+
Overview: {
|
|
260
|
+
id: 2,
|
|
261
|
+
url: "/docs/overview1",
|
|
262
|
+
},
|
|
263
|
+
"Overview 1": {
|
|
264
|
+
id: 3,
|
|
265
|
+
url: "/docs/overview2",
|
|
266
|
+
},
|
|
267
|
+
"Overview 2": {
|
|
268
|
+
id: 4,
|
|
269
|
+
url: "/docs/overview3",
|
|
270
|
+
},
|
|
271
|
+
},
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
describe("when nodes have no name", () => {
|
|
276
|
+
it("uses node type as fallback name", () => {
|
|
277
|
+
const tree = [
|
|
278
|
+
{
|
|
279
|
+
id: 1,
|
|
280
|
+
type: "category",
|
|
281
|
+
name: "",
|
|
282
|
+
hidden: false,
|
|
283
|
+
children: [
|
|
284
|
+
{
|
|
285
|
+
id: 2,
|
|
286
|
+
type: "page",
|
|
287
|
+
name: "",
|
|
288
|
+
url: "/page1",
|
|
289
|
+
hidden: false,
|
|
290
|
+
children: [],
|
|
291
|
+
category_overview_page: false,
|
|
292
|
+
},
|
|
293
|
+
],
|
|
294
|
+
},
|
|
295
|
+
];
|
|
296
|
+
const result = formatTreeAsJson(tree);
|
|
297
|
+
expect(result).toEqual({
|
|
298
|
+
category: {
|
|
299
|
+
page: {
|
|
300
|
+
id: 2,
|
|
301
|
+
url: "/page1",
|
|
302
|
+
},
|
|
303
|
+
},
|
|
304
|
+
});
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
describe("when tree has tab nodes", () => {
|
|
308
|
+
it("ignores tab nodes", () => {
|
|
309
|
+
const tree = [
|
|
310
|
+
{
|
|
311
|
+
id: 1,
|
|
312
|
+
type: "category",
|
|
313
|
+
name: "Main",
|
|
314
|
+
hidden: false,
|
|
315
|
+
children: [
|
|
316
|
+
{
|
|
317
|
+
id: 3,
|
|
318
|
+
type: "page",
|
|
319
|
+
name: "Page1",
|
|
320
|
+
url: "/page1",
|
|
321
|
+
hidden: false,
|
|
322
|
+
children: [
|
|
323
|
+
{
|
|
324
|
+
id: 2,
|
|
325
|
+
type: "tab",
|
|
326
|
+
name: "Tab1",
|
|
327
|
+
url: "/tab1",
|
|
328
|
+
hidden: false,
|
|
329
|
+
children: [],
|
|
330
|
+
},
|
|
331
|
+
],
|
|
332
|
+
category_overview_page: false,
|
|
333
|
+
},
|
|
334
|
+
],
|
|
335
|
+
},
|
|
336
|
+
];
|
|
337
|
+
const result = formatTreeAsJson(tree);
|
|
338
|
+
expect(result).toEqual({
|
|
339
|
+
Main: {
|
|
340
|
+
Page1: {
|
|
341
|
+
id: 3,
|
|
342
|
+
url: "/page1",
|
|
343
|
+
},
|
|
344
|
+
},
|
|
345
|
+
});
|
|
346
|
+
});
|
|
347
|
+
});
|
|
348
|
+
describe("when tree has complex nested structure", () => {
|
|
349
|
+
it("handles multiple levels of nesting correctly", () => {
|
|
350
|
+
const tree = [
|
|
351
|
+
{
|
|
352
|
+
id: 1,
|
|
353
|
+
type: "navigation",
|
|
354
|
+
name: "Root",
|
|
355
|
+
hidden: false,
|
|
356
|
+
children: [
|
|
357
|
+
{
|
|
358
|
+
id: 2,
|
|
359
|
+
type: "category",
|
|
360
|
+
name: "Section A",
|
|
361
|
+
hidden: false,
|
|
362
|
+
children: [
|
|
363
|
+
{
|
|
364
|
+
id: 3,
|
|
365
|
+
type: "category",
|
|
366
|
+
name: "Subsection 1",
|
|
367
|
+
hidden: false,
|
|
368
|
+
children: [
|
|
369
|
+
{
|
|
370
|
+
id: 4,
|
|
371
|
+
type: "page",
|
|
372
|
+
name: "Page A",
|
|
373
|
+
url: "/a/1/a",
|
|
374
|
+
hidden: false,
|
|
375
|
+
children: [],
|
|
376
|
+
category_overview_page: false,
|
|
377
|
+
},
|
|
378
|
+
{
|
|
379
|
+
id: 5,
|
|
380
|
+
type: "page",
|
|
381
|
+
name: "Page B",
|
|
382
|
+
url: "/a/1/b",
|
|
383
|
+
hidden: false,
|
|
384
|
+
children: [],
|
|
385
|
+
category_overview_page: false,
|
|
386
|
+
},
|
|
387
|
+
],
|
|
388
|
+
},
|
|
389
|
+
{
|
|
390
|
+
id: 6,
|
|
391
|
+
type: "page",
|
|
392
|
+
name: "Direct Page",
|
|
393
|
+
url: "/a/direct",
|
|
394
|
+
hidden: false,
|
|
395
|
+
children: [],
|
|
396
|
+
category_overview_page: false,
|
|
397
|
+
},
|
|
398
|
+
],
|
|
399
|
+
},
|
|
400
|
+
],
|
|
401
|
+
},
|
|
402
|
+
];
|
|
403
|
+
const result = formatTreeAsJson(tree);
|
|
404
|
+
expect(result).toEqual({
|
|
405
|
+
Root: {
|
|
406
|
+
"Section A": {
|
|
407
|
+
"Subsection 1": {
|
|
408
|
+
"Page A": {
|
|
409
|
+
id: 4,
|
|
410
|
+
url: "/a/1/a",
|
|
411
|
+
},
|
|
412
|
+
"Page B": {
|
|
413
|
+
id: 5,
|
|
414
|
+
url: "/a/1/b",
|
|
415
|
+
},
|
|
416
|
+
},
|
|
417
|
+
"Direct Page": {
|
|
418
|
+
id: 6,
|
|
419
|
+
url: "/a/direct",
|
|
420
|
+
},
|
|
421
|
+
},
|
|
422
|
+
},
|
|
423
|
+
});
|
|
424
|
+
});
|
|
425
|
+
});
|
|
426
|
+
describe("when multiple root nodes have duplicate names", () => {
|
|
427
|
+
it("handles duplicate names at root level", () => {
|
|
428
|
+
const tree = [
|
|
429
|
+
{
|
|
430
|
+
id: 1,
|
|
431
|
+
type: "category",
|
|
432
|
+
name: "Section",
|
|
433
|
+
hidden: false,
|
|
434
|
+
children: [],
|
|
435
|
+
},
|
|
436
|
+
{
|
|
437
|
+
id: 2,
|
|
438
|
+
type: "category",
|
|
439
|
+
name: "Section",
|
|
440
|
+
hidden: false,
|
|
441
|
+
children: [],
|
|
442
|
+
},
|
|
443
|
+
];
|
|
444
|
+
const result = formatTreeAsJson(tree);
|
|
445
|
+
expect(result).toEqual({
|
|
446
|
+
Section: {},
|
|
447
|
+
"Section 1": {},
|
|
448
|
+
});
|
|
449
|
+
});
|
|
450
|
+
});
|
|
451
|
+
});
|
|
452
|
+
//# sourceMappingURL=styleguide.test.js.map
|
|
453
|
+
//# debugId=a1566a24-9938-599b-a8a8-1237e4dbc1d7
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styleguide.test.js","sources":["common/formatters/styleguide.test.ts"],"sourceRoot":"/","sourcesContent":["import { expect, describe, it } from \"@rstest/core\";\n\nimport {\n formatStyleguideListAsMarkdown,\n formatTreeAsJson,\n} from \"./styleguide.js\";\nimport { NodeType } from \"../../api/types/styleguide.js\";\n\ndescribe(\"formatStyleguideListAsMarkdown\", () => {\n describe(\"when list is empty\", () => {\n it(\"returns an empty string\", () => {\n expect(formatStyleguideListAsMarkdown([])).toBe(\"\");\n });\n });\n\n describe(\"when there's one styleguide\", () => {\n it(\"formats styleguide list as markdown list on one line\", () => {\n expect(\n formatStyleguideListAsMarkdown([\n { id: 1, name: \"Styleguide 1\", team_id: 1, share_id: \"abc123\" },\n ]),\n ).toBe(\"- Styleguide 1 (ID: 1)\");\n });\n });\n\n describe(\"when there's multiple styleguides\", () => {\n it(\"formats styleguide list as markdown list\", () => {\n expect(\n formatStyleguideListAsMarkdown([\n { id: 1, name: \"Styleguide 1\", team_id: 1, share_id: \"abc123\" },\n { id: 2, name: \"Styleguide 2\", team_id: 1, share_id: \"xyz987\" },\n ]),\n ).toBe(\"- Styleguide 1 (ID: 1)\\n- Styleguide 2 (ID: 2)\");\n });\n });\n});\n\ndescribe(\"formatTreeAsJson\", () => {\n describe(\"when tree is empty\", () => {\n it(\"returns an empty object\", () => {\n expect(formatTreeAsJson([])).toEqual({});\n });\n });\n\n describe(\"when tree has a single page node\", () => {\n it(\"creates nested structure with page info\", () => {\n const tree: NodeType[] = [\n {\n id: 1,\n type: \"category\",\n name: \"Documentation\",\n hidden: false,\n children: [\n {\n id: 2,\n type: \"page\",\n name: \"Getting Started\",\n url: \"/docs/getting-started\",\n hidden: false,\n children: [],\n category_overview_page: false,\n },\n ],\n },\n ];\n\n const result = formatTreeAsJson(tree);\n expect(result).toEqual({\n Documentation: {\n \"Getting Started\": {\n id: 2,\n url: \"/docs/getting-started\",\n },\n },\n });\n });\n });\n\n describe(\"when tree has multiple categories\", () => {\n it(\"creates nested structure for each category\", () => {\n const tree: NodeType[] = [\n {\n id: 1,\n type: \"category\",\n name: \"API\",\n hidden: false,\n children: [\n {\n id: 2,\n type: \"page\",\n name: \"REST API\",\n url: \"/api/rest\",\n hidden: false,\n children: [],\n category_overview_page: false,\n },\n ],\n },\n {\n id: 3,\n type: \"category\",\n name: \"Guides\",\n hidden: false,\n children: [\n {\n id: 4,\n type: \"page\",\n name: \"Tutorial\",\n url: \"/guides/tutorial\",\n hidden: false,\n children: [],\n category_overview_page: false,\n },\n ],\n },\n ];\n\n const result = formatTreeAsJson(tree);\n expect(result).toEqual({\n API: {\n \"REST API\": {\n id: 2,\n url: \"/api/rest\",\n },\n },\n Guides: {\n Tutorial: {\n id: 4,\n url: \"/guides/tutorial\",\n },\n },\n });\n });\n });\n\n describe(\"when tree has nested categories\", () => {\n it(\"creates deeply nested structure\", () => {\n const tree: NodeType[] = [\n {\n id: 1,\n type: \"category\",\n name: \"Documentation\",\n hidden: false,\n children: [\n {\n id: 2,\n type: \"category\",\n name: \"API\",\n hidden: false,\n children: [\n {\n id: 3,\n type: \"page\",\n name: \"Reference\",\n url: \"/docs/api/reference\",\n hidden: false,\n children: [],\n category_overview_page: false,\n },\n ],\n },\n ],\n },\n ];\n\n const result = formatTreeAsJson(tree);\n expect(result).toEqual({\n Documentation: {\n API: {\n Reference: {\n id: 3,\n url: \"/docs/api/reference\",\n },\n },\n },\n });\n });\n });\n\n describe(\"when tree has navigation nodes\", () => {\n it(\"processes navigation nodes and their children\", () => {\n const tree: NodeType[] = [\n {\n id: 1,\n type: \"navigation\",\n name: \"Main Nav\",\n hidden: false,\n children: [\n {\n id: 2,\n type: \"page\",\n name: \"Home\",\n url: \"/home\",\n hidden: false,\n children: [],\n category_overview_page: false,\n },\n {\n id: 3,\n type: \"category\",\n name: \"Products\",\n hidden: false,\n children: [\n {\n id: 4,\n type: \"page\",\n name: \"Product A\",\n url: \"/products/a\",\n hidden: false,\n children: [],\n category_overview_page: false,\n },\n ],\n },\n ],\n },\n ];\n\n const result = formatTreeAsJson(tree);\n expect(result).toEqual({\n \"Main Nav\": {\n Home: {\n id: 2,\n url: \"/home\",\n },\n Products: {\n \"Product A\": {\n id: 4,\n url: \"/products/a\",\n },\n },\n },\n });\n });\n });\n\n describe(\"when nodes have duplicate names\", () => {\n it(\"appends numbers to make names unique\", () => {\n const tree: NodeType[] = [\n {\n id: 1,\n type: \"category\",\n name: \"Docs\",\n hidden: false,\n children: [\n {\n id: 2,\n type: \"page\",\n name: \"Overview\",\n url: \"/docs/overview1\",\n hidden: false,\n children: [],\n category_overview_page: false,\n },\n {\n id: 3,\n type: \"page\",\n name: \"Overview\",\n url: \"/docs/overview2\",\n hidden: false,\n children: [],\n category_overview_page: false,\n },\n {\n id: 4,\n type: \"page\",\n name: \"Overview\",\n url: \"/docs/overview3\",\n hidden: false,\n children: [],\n category_overview_page: false,\n },\n ],\n },\n ];\n\n const result = formatTreeAsJson(tree);\n expect(result).toEqual({\n Docs: {\n Overview: {\n id: 2,\n url: \"/docs/overview1\",\n },\n \"Overview 1\": {\n id: 3,\n url: \"/docs/overview2\",\n },\n \"Overview 2\": {\n id: 4,\n url: \"/docs/overview3\",\n },\n },\n });\n });\n });\n\n describe(\"when nodes have no name\", () => {\n it(\"uses node type as fallback name\", () => {\n const tree: NodeType[] = [\n {\n id: 1,\n type: \"category\",\n name: \"\",\n hidden: false,\n children: [\n {\n id: 2,\n type: \"page\",\n name: \"\",\n url: \"/page1\",\n hidden: false,\n children: [],\n category_overview_page: false,\n },\n ],\n },\n ];\n\n const result = formatTreeAsJson(tree);\n expect(result).toEqual({\n category: {\n page: {\n id: 2,\n url: \"/page1\",\n },\n },\n });\n });\n });\n\n describe(\"when tree has tab nodes\", () => {\n it(\"ignores tab nodes\", () => {\n const tree: NodeType[] = [\n {\n id: 1,\n type: \"category\",\n name: \"Main\",\n hidden: false,\n children: [\n {\n id: 3,\n type: \"page\",\n name: \"Page1\",\n url: \"/page1\",\n hidden: false,\n children: [\n {\n id: 2,\n type: \"tab\",\n name: \"Tab1\",\n url: \"/tab1\",\n hidden: false,\n children: [],\n },\n ],\n category_overview_page: false,\n },\n ],\n },\n ];\n\n const result = formatTreeAsJson(tree);\n expect(result).toEqual({\n Main: {\n Page1: {\n id: 3,\n url: \"/page1\",\n },\n },\n });\n });\n });\n\n describe(\"when tree has complex nested structure\", () => {\n it(\"handles multiple levels of nesting correctly\", () => {\n const tree: NodeType[] = [\n {\n id: 1,\n type: \"navigation\",\n name: \"Root\",\n hidden: false,\n children: [\n {\n id: 2,\n type: \"category\",\n name: \"Section A\",\n hidden: false,\n children: [\n {\n id: 3,\n type: \"category\",\n name: \"Subsection 1\",\n hidden: false,\n children: [\n {\n id: 4,\n type: \"page\",\n name: \"Page A\",\n url: \"/a/1/a\",\n hidden: false,\n children: [],\n category_overview_page: false,\n },\n {\n id: 5,\n type: \"page\",\n name: \"Page B\",\n url: \"/a/1/b\",\n hidden: false,\n children: [],\n category_overview_page: false,\n },\n ],\n },\n {\n id: 6,\n type: \"page\",\n name: \"Direct Page\",\n url: \"/a/direct\",\n hidden: false,\n children: [],\n category_overview_page: false,\n },\n ],\n },\n ],\n },\n ];\n\n const result = formatTreeAsJson(tree);\n expect(result).toEqual({\n Root: {\n \"Section A\": {\n \"Subsection 1\": {\n \"Page A\": {\n id: 4,\n url: \"/a/1/a\",\n },\n \"Page B\": {\n id: 5,\n url: \"/a/1/b\",\n },\n },\n \"Direct Page\": {\n id: 6,\n url: \"/a/direct\",\n },\n },\n },\n });\n });\n });\n\n describe(\"when multiple root nodes have duplicate names\", () => {\n it(\"handles duplicate names at root level\", () => {\n const tree: NodeType[] = [\n {\n id: 1,\n type: \"category\",\n name: \"Section\",\n hidden: false,\n children: [],\n },\n {\n id: 2,\n type: \"category\",\n name: \"Section\",\n hidden: false,\n children: [],\n },\n ];\n\n const result = formatTreeAsJson(tree);\n expect(result).toEqual({\n Section: {},\n \"Section 1\": {},\n });\n });\n });\n});\n"],"names":[],"mappings":"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","debug_id":"a1566a24-9938-599b-a8a8-1237e4dbc1d7"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="c0c825d2-da83-500a-98f6-80086abbe1a6")}catch(e){}}();
|
|
2
4
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
5
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
6
|
import packageJson from "../package.json" with { type: "json" };
|
|
@@ -8,6 +10,8 @@ import { registerGetStyleguideTreeTool, registerListStyleguidesTool, } from "./t
|
|
|
8
10
|
import { registerGetPageTool, registerListPagesTool } from "./tools/page.js";
|
|
9
11
|
import { recommendSummarizePagePrompt } from "./prompts/page.js";
|
|
10
12
|
import { registerRecommendPagesPrompt } from "./prompts/styleguide.js";
|
|
13
|
+
import { initSentry } from "./api/sentry.js";
|
|
14
|
+
import { captureException } from "./common/errors.js";
|
|
11
15
|
function createServer() {
|
|
12
16
|
// Create server instance
|
|
13
17
|
const server = new McpServer({
|
|
@@ -38,6 +42,10 @@ function createServer() {
|
|
|
38
42
|
}
|
|
39
43
|
// Start server on STDIO
|
|
40
44
|
async function main() {
|
|
45
|
+
const disableTelemetry = process.env["ZEROHEIGHT_MCP_DISABLE_TELEMETRY"];
|
|
46
|
+
if (!disableTelemetry) {
|
|
47
|
+
initSentry();
|
|
48
|
+
}
|
|
41
49
|
const server = createServer();
|
|
42
50
|
const transport = new StdioServerTransport();
|
|
43
51
|
await server.connect(transport);
|
|
@@ -45,5 +53,8 @@ async function main() {
|
|
|
45
53
|
}
|
|
46
54
|
main().catch((error) => {
|
|
47
55
|
console.error("Fatal error in main():", error);
|
|
56
|
+
captureException(error);
|
|
48
57
|
process.exit(1);
|
|
49
58
|
});
|
|
59
|
+
//# sourceMappingURL=index.js.map
|
|
60
|
+
//# debugId=c0c825d2-da83-500a-98f6-80086abbe1a6
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["index.ts"],"sourceRoot":"/","sourcesContent":["#!/usr/bin/env node\n\nimport * as Sentry from \"@sentry/node\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\n\nimport packageJson from \"../package.json\" with { type: \"json\" };\nimport {\n registerStyleguideListResource,\n registerStyleguideResource,\n} from \"./resources/styleguide.js\";\nimport {\n registerListPagesResource,\n registerPageResource,\n} from \"./resources/page.js\";\nimport {\n registerGetStyleguideTreeTool,\n registerListStyleguidesTool,\n} from \"./tools/styleguide.js\";\nimport { registerGetPageTool, registerListPagesTool } from \"./tools/page.js\";\nimport { recommendSummarizePagePrompt } from \"./prompts/page.js\";\nimport { registerRecommendPagesPrompt } from \"./prompts/styleguide.js\";\nimport { initSentry } from \"./api/sentry.js\";\nimport { captureException } from \"./common/errors.js\";\n\nfunction createServer() {\n // Create server instance\n const server = new McpServer({\n name: \"zeroheight\",\n version: packageJson.version,\n capabilities: {\n resources: {},\n tools: {},\n },\n });\n\n // Register all tools\n [\n registerListPagesTool,\n registerGetPageTool,\n registerListStyleguidesTool,\n registerGetStyleguideTreeTool,\n ].forEach((fn) => fn(server));\n\n // Register all resources\n [\n registerStyleguideListResource,\n registerStyleguideResource,\n registerListPagesResource,\n registerPageResource,\n ].forEach((fn) => fn(server));\n\n // Register all prompts\n [registerRecommendPagesPrompt, recommendSummarizePagePrompt].forEach((fn) =>\n fn(server),\n );\n\n return server;\n}\n\n// Start server on STDIO\nasync function main() {\n const disableTelemetry = process.env[\"ZEROHEIGHT_MCP_DISABLE_TELEMETRY\"];\n if (!disableTelemetry) {\n initSentry();\n }\n\n const server = createServer();\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error(\"zeroheight MCP Server running on stdio\");\n}\n\nmain().catch((error) => {\n console.error(\"Fatal error in main():\", error);\n captureException(error);\n process.exit(1);\n});\n"],"names":[],"mappings":";;;AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,WAAW,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAChE,OAAO,EACL,8BAA8B,EAC9B,0BAA0B,GAC3B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,SAAS,YAAY;IACnB,yBAAyB;IACzB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,YAAY,EAAE;YACZ,SAAS,EAAE,EAAE;YACb,KAAK,EAAE,EAAE;SACV;KACF,CAAC,CAAC;IAEH,qBAAqB;IACrB;QACE,qBAAqB;QACrB,mBAAmB;QACnB,2BAA2B;QAC3B,6BAA6B;KAC9B,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAE9B,yBAAyB;IACzB;QACE,8BAA8B;QAC9B,0BAA0B;QAC1B,yBAAyB;QACzB,oBAAoB;KACrB,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAE9B,uBAAuB;IACvB,CAAC,4BAA4B,EAAE,4BAA4B,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAC1E,EAAE,CAAC,MAAM,CAAC,CACX,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,wBAAwB;AACxB,KAAK,UAAU,IAAI;IACjB,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IACzE,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,UAAU,EAAE,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;AAC1D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;IAC/C,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC","debug_id":"c0c825d2-da83-500a-98f6-80086abbe1a6"}
|
package/dist/prompts/page.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="6f8e66e1-8ab2-5b9a-ac8f-d910a808c990")}catch(e){}}();
|
|
1
3
|
import z from "zod";
|
|
2
4
|
export function recommendSummarizePagePrompt(server) {
|
|
3
5
|
server.registerPrompt("summarize-page", {
|
|
@@ -26,3 +28,5 @@ export function recommendSummarizePagePrompt(server) {
|
|
|
26
28
|
],
|
|
27
29
|
}));
|
|
28
30
|
}
|
|
31
|
+
//# sourceMappingURL=page.js.map
|
|
32
|
+
//# debugId=6f8e66e1-8ab2-5b9a-ac8f-d910a808c990
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.js","sources":["prompts/page.ts"],"sourceRoot":"/","sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport z from \"zod\";\n\nexport function recommendSummarizePagePrompt(server: McpServer) {\n server.registerPrompt(\n \"summarize-page\",\n {\n title: \"Summarize Page\",\n description: \"Give a TLDR page summary\",\n argsSchema: {\n pageId: z.string(),\n releaseId: z.string().optional(),\n },\n },\n ({ pageId, releaseId }) => ({\n messages: [\n {\n role: \"assistant\",\n content: {\n type: \"text\",\n text: \"Your goal is to find the page in zeroheight and summarize it.\",\n },\n },\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: `Summarize the following page: ${pageId}.${releaseId ? `Get the page from this release: ${releaseId}` : \"\"}`,\n },\n },\n ],\n }),\n );\n}\n"],"names":[],"mappings":";;AACA,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,MAAM,UAAU,4BAA4B,CAAC,MAAiB;IAC5D,MAAM,CAAC,cAAc,CACnB,gBAAgB,EAChB;QACE,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,0BAA0B;QACvC,UAAU,EAAE;YACV,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;YAClB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SACjC;KACF,EACD,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1B,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,+DAA+D;iBACtE;aACF;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,iCAAiC,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,mCAAmC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;iBACnH;aACF;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC","debug_id":"6f8e66e1-8ab2-5b9a-ac8f-d910a808c990"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="cb65ad75-161e-5265-8e2d-f8711705e930")}catch(e){}}();
|
|
1
3
|
import z from "zod";
|
|
2
4
|
export function registerRecommendPagesPrompt(server) {
|
|
3
5
|
server.registerPrompt("recommend-pages", {
|
|
@@ -26,3 +28,5 @@ export function registerRecommendPagesPrompt(server) {
|
|
|
26
28
|
],
|
|
27
29
|
}));
|
|
28
30
|
}
|
|
31
|
+
//# sourceMappingURL=styleguide.js.map
|
|
32
|
+
//# debugId=cb65ad75-161e-5265-8e2d-f8711705e930
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styleguide.js","sources":["prompts/styleguide.ts"],"sourceRoot":"/","sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport z from \"zod\";\n\nexport function registerRecommendPagesPrompt(server: McpServer) {\n server.registerPrompt(\n \"recommend-pages\",\n {\n title: \"Recommend Pages\",\n description: \"Find useful pages on a given topic\",\n argsSchema: {\n styleguideId: z.string(),\n topic: z.string(),\n },\n },\n ({ styleguideId, topic }) => ({\n messages: [\n {\n role: \"assistant\",\n content: {\n type: \"text\",\n text: \"Your goal is to find pages in a styleguide and recommend the top 5 most relevant to the given task.\",\n },\n },\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: `Look at the navigation tree for this styleguide: ${styleguideId}.\\n\\nReturn the URLs for the top 5 most relevant pages about this topic: ${topic}.`,\n },\n },\n ],\n }),\n );\n}\n"],"names":[],"mappings":";;AACA,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,MAAM,UAAU,4BAA4B,CAAC,MAAiB;IAC5D,MAAM,CAAC,cAAc,CACnB,iBAAiB,EACjB;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,oCAAoC;QACjD,UAAU,EAAE;YACV,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;YACxB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;SAClB;KACF,EACD,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5B,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,qGAAqG;iBAC5G;aACF;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,oDAAoD,YAAY,4EAA4E,KAAK,GAAG;iBAC3J;aACF;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC","debug_id":"cb65ad75-161e-5265-8e2d-f8711705e930"}
|
package/dist/resources/page.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Page Resources
|
|
3
3
|
*/
|
|
4
|
+
|
|
5
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="55dbe510-b8b2-58cc-aee9-97cd6357263a")}catch(e){}}();
|
|
4
6
|
import { ResourceTemplate, } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
7
|
import { completionForStyleduideId, listStyleguideResources, } from "./styleguide.js";
|
|
6
8
|
import { getPage, listPages } from "../api/page.js";
|
|
@@ -72,3 +74,5 @@ export async function completionForPageId(searchTerm, context) {
|
|
|
72
74
|
.includes(searchTerm.toLocaleLowerCase()));
|
|
73
75
|
return matchingPages.map((page) => page.id.toString());
|
|
74
76
|
}
|
|
77
|
+
//# sourceMappingURL=page.js.map
|
|
78
|
+
//# debugId=55dbe510-b8b2-58cc-aee9-97cd6357263a
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.js","sources":["resources/page.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Page Resources\n */\n\nimport {\n McpServer,\n ResourceTemplate,\n} from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\nimport {\n completionForStyleduideId,\n listStyleguideResources,\n} from \"./styleguide.js\";\nimport { getPage, listPages } from \"../api/page.js\";\nimport { formatPageAsMarkdown } from \"../common/formatters/page.js\";\n\nexport function registerListPagesResource(server: McpServer) {\n server.registerResource(\n \"styleguide-page-list\",\n new ResourceTemplate(\"zeroheight://styleguide/{styleguideId}/page-list\", {\n list: listStyleguideResources,\n complete: {\n styleguideId: completionForStyleduideId,\n },\n }),\n {\n title: \"List the pages for a styleguide\",\n description: \"List all pages in a styleguide\",\n mimeType: \"text/markdown\",\n },\n async (uri, { styleguideId }) => {\n const selectedId = Array.isArray(styleguideId)\n ? styleguideId[0]\n : styleguideId;\n\n const parsedStyleguideId = parseInt(selectedId, 10);\n const pages = await listPages(parsedStyleguideId);\n\n return {\n contents: [\n {\n uri: uri.href,\n text: pages\n .map((page) => `- ${page.name} (id: ${page.id})`)\n .join(\"\\n\"),\n },\n ],\n };\n },\n );\n}\n\nexport function registerPageResource(server: McpServer) {\n server.registerResource(\n \"page\",\n new ResourceTemplate(\n \"zeroheight://styleguide/{styleguideId}/page/{pageId}\",\n {\n list: undefined,\n complete: {\n styleguideId: completionForStyleduideId,\n pageId: completionForStyleduideId,\n },\n },\n ),\n {\n title: \"Page\",\n description: \"Design system page\",\n mimeType: \"text/markdown\",\n },\n async (uri, { pageId }) => {\n const selectedId = Array.isArray(pageId) ? pageId[0] : pageId;\n const parsedPageId = parseInt(selectedId, 10);\n const page = await getPage(parsedPageId);\n\n if (!page) {\n throw new Error(\"Couldn't find the page\");\n }\n\n return {\n contents: [\n {\n uri: uri.href,\n text: formatPageAsMarkdown(page),\n mimeType: \"text/markdown\",\n },\n ],\n };\n },\n );\n}\n\n/** Utils */\n\nexport async function completionForPageId(\n searchTerm: string,\n context: {\n arguments?: Record<string, string>;\n },\n) {\n const styleguideId = parseInt(context.arguments?.styleguideId ?? \"\", 10);\n const pageList = await listPages(styleguideId);\n const matchingPages = pageList.filter((page) =>\n page.id\n .toString()\n .toLocaleLowerCase()\n .includes(searchTerm.toLocaleLowerCase()),\n );\n return matchingPages.map((page) => page.id.toString());\n}\n"],"names":[],"mappings":"AAAA;;GAEG;;;AAEH,OAAO,EAEL,gBAAgB,GACjB,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EACL,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,MAAM,UAAU,yBAAyB,CAAC,MAAiB;IACzD,MAAM,CAAC,gBAAgB,CACrB,sBAAsB,EACtB,IAAI,gBAAgB,CAAC,kDAAkD,EAAE;QACvE,IAAI,EAAE,uBAAuB;QAC7B,QAAQ,EAAE;YACR,YAAY,EAAE,yBAAyB;SACxC;KACF,CAAC,EACF;QACE,KAAK,EAAE,iCAAiC;QACxC,WAAW,EAAE,gCAAgC;QAC7C,QAAQ,EAAE,eAAe;KAC1B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE;QAC9B,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;YAC5C,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;YACjB,CAAC,CAAC,YAAY,CAAC;QAEjB,MAAM,kBAAkB,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAElD,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,IAAI,EAAE,KAAK;yBACR,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,GAAG,CAAC;yBAChD,IAAI,CAAC,IAAI,CAAC;iBACd;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,gBAAgB,CACrB,MAAM,EACN,IAAI,gBAAgB,CAClB,sDAAsD,EACtD;QACE,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE;YACR,YAAY,EAAE,yBAAyB;YACvC,MAAM,EAAE,yBAAyB;SAClC;KACF,CACF,EACD;QACE,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,oBAAoB;QACjC,QAAQ,EAAE,eAAe;KAC1B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACxB,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC9D,MAAM,YAAY,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC;QAEzC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;QAED,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,IAAI,EAAE,oBAAoB,CAAC,IAAI,CAAC;oBAChC,QAAQ,EAAE,eAAe;iBAC1B;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,YAAY;AAEZ,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,UAAkB,EAClB,OAEC;IAED,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,YAAY,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,CAAC;IAC/C,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAC7C,IAAI,CAAC,EAAE;SACJ,QAAQ,EAAE;SACV,iBAAiB,EAAE;SACnB,QAAQ,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAC5C,CAAC;IACF,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;AACzD,CAAC","debug_id":"55dbe510-b8b2-58cc-aee9-97cd6357263a"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Styleguide Resources
|
|
3
3
|
*/
|
|
4
|
+
|
|
5
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="24d1c786-6c08-54bb-8217-d21f78b2cba8")}catch(e){}}();
|
|
4
6
|
import { ResourceTemplate, } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
7
|
import { getStyleguideTree, listStyleguides } from "../api/styleguide.js";
|
|
6
8
|
import { DEFAULT_NAME, formatTreeAsJson, } from "../common/formatters/styleguide.js";
|
|
@@ -85,3 +87,5 @@ export async function listStyleguideResources() {
|
|
|
85
87
|
resources,
|
|
86
88
|
};
|
|
87
89
|
}
|
|
90
|
+
//# sourceMappingURL=styleguide.js.map
|
|
91
|
+
//# debugId=24d1c786-6c08-54bb-8217-d21f78b2cba8
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styleguide.js","sources":["resources/styleguide.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Styleguide Resources\n */\n\nimport {\n McpServer,\n ResourceTemplate,\n} from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\nimport { getStyleguideTree, listStyleguides } from \"../api/styleguide.js\";\nimport {\n DEFAULT_NAME,\n formatTreeAsJson,\n} from \"../common/formatters/styleguide.js\";\n\nexport function registerStyleguideListResource(server: McpServer) {\n server.registerResource(\n \"styleguide-list\",\n \"zeroheight://styleguide/list\",\n {\n title: \"Styleguide list\",\n description: \"List all accessible styleguides\",\n mimeType: \"application/json\",\n },\n async (uri) => {\n const styleguideList = await listStyleguides();\n const styleguideResources = styleguideList.map((styleguide) => ({\n id: styleguide.id,\n name: styleguide.name ?? DEFAULT_NAME,\n }));\n\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(styleguideResources, null, 2),\n mimeType: \"application/json\",\n },\n ],\n };\n },\n );\n}\n\nexport function registerStyleguideResource(server: McpServer) {\n server.registerResource(\n \"styleguide\",\n new ResourceTemplate(\"zeroheight://styleguide/{styleguideId}\", {\n list: undefined,\n complete: {\n styleguideId: completionForStyleduideId,\n },\n }),\n {\n title: \"Styleguide Navigation\",\n description:\n \"Access the styleguide's navigation including categories, pages and tabs\",\n },\n async (uri, { styleguideId }) => {\n console.log({ uri, styleguideId });\n const selectedId = Array.isArray(styleguideId)\n ? styleguideId[0]\n : styleguideId;\n\n console.log({ selectedId });\n\n const parsedStyleguideId = parseInt(selectedId, 10);\n // TODO: Make endpoint to get basic styleguide info instead\n const styleguideList = await listStyleguides();\n console.log({ styleguideList });\n const currentStyleguide = styleguideList.find(\n (styleguide) => styleguide.id === parsedStyleguideId,\n );\n\n if (!currentStyleguide) {\n return { contents: [] };\n }\n\n const tree = await getStyleguideTree(parsedStyleguideId);\n\n const formattedTree = formatTreeAsJson(tree);\n\n return {\n contents: [\n {\n mimeType: \"application/json\",\n uri: uri.href,\n text: JSON.stringify(formattedTree, null, 2),\n },\n ],\n };\n },\n );\n}\n\n/** Utils */\n\nexport async function completionForStyleduideId(searchTerm: string) {\n const styleguideList = await listStyleguides();\n const matchingStyleguides = styleguideList.filter((styleguide) =>\n styleguide.id\n .toString()\n .toLocaleLowerCase()\n .includes(searchTerm.toLocaleLowerCase()),\n );\n return matchingStyleguides.map((styleguide) => styleguide.id.toString());\n}\n\nexport async function listStyleguideResources() {\n const styleguideList = await listStyleguides();\n const resources = styleguideList.map((styleguide) => ({\n uri: `zeroheight://styleguide/${styleguide.id}`,\n name: `${styleguide.name ?? DEFAULT_NAME}`,\n _meta: {\n id: styleguide.id,\n shareId: styleguide.share_id,\n },\n }));\n\n return {\n resources,\n };\n}\n"],"names":[],"mappings":"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","debug_id":"24d1c786-6c08-54bb-8217-d21f78b2cba8"}
|
package/dist/tools/page.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Page Tools
|
|
3
3
|
*/
|
|
4
|
+
|
|
5
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="4287cdf1-ffbe-5acb-8d13-fd2ad1a3cdd7")}catch(e){}}();
|
|
4
6
|
import z from "zod";
|
|
5
7
|
import { getPage, listPages } from "../api/page.js";
|
|
6
8
|
import { formatPageAsMarkdown, formatPageListItemsAsMarkdown, } from "../common/formatters/page.js";
|
|
@@ -106,3 +108,5 @@ export function registerGetPageTool(server) {
|
|
|
106
108
|
};
|
|
107
109
|
});
|
|
108
110
|
}
|
|
111
|
+
//# sourceMappingURL=page.js.map
|
|
112
|
+
//# debugId=4287cdf1-ffbe-5acb-8d13-fd2ad1a3cdd7
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.js","sources":["tools/page.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Page Tools\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { ResourceLink } from \"@modelcontextprotocol/sdk/types.js\";\nimport z from \"zod\";\n\nimport { getPage, listPages } from \"../api/page.js\";\nimport {\n formatPageAsMarkdown,\n formatPageListItemsAsMarkdown,\n} from \"../common/formatters/page.js\";\n\nexport function registerListPagesTool(server: McpServer) {\n server.registerTool(\n \"list-pages\",\n {\n title: \"List pages for a styleguide\",\n description: \"List all accessible pages in a styleguide\",\n inputSchema: {\n styleguideId: z.number().int().positive(),\n releaseId: z.number().int().optional(),\n searchTerm: z.string().optional(),\n responseFormat: z\n .enum([\"markdown\", \"resource_links\"])\n .default(\"markdown\"),\n },\n },\n async ({ styleguideId, releaseId, searchTerm, responseFormat }) => {\n const pages = await listPages(styleguideId, { releaseId, searchTerm });\n\n if (pages.length === 0) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"There are no pages in this styleguide, check you have the correct styleguide ID\",\n },\n ],\n };\n }\n\n if (responseFormat === \"markdown\") {\n return {\n content: [\n {\n type: \"text\",\n text: formatPageListItemsAsMarkdown(pages),\n mimeType: \"text/markdown\",\n },\n ],\n };\n }\n\n const resourceLinks: ResourceLink[] = pages.map((page) => ({\n type: \"resource_link\",\n uri: `zeroheight://styleguide/${styleguideId}/page/${page.id}`,\n name: page.name ?? \"Unnamed Page\",\n _meta: {\n createdAt: page.created_at,\n id: page.id,\n },\n mimeType: \"text/markdown\",\n description: \"Styleguide page\",\n }));\n\n return {\n content: [\n {\n type: \"text\",\n text: `There are ${pages.length} pages in the styleguide: `,\n },\n ...resourceLinks,\n ],\n };\n },\n );\n}\n\nexport function registerGetPageTool(server: McpServer) {\n server.registerTool(\n \"get-page\",\n {\n title: \"Get a styleguide page\",\n description: \"Get a page in the requested format\",\n inputSchema: {\n pageId: z.string(),\n releaseId: z.number().int().optional(),\n responseFormat: z.enum([\"markdown\", \"json\"]).default(\"json\"),\n },\n },\n async ({ pageId, responseFormat }) => {\n const page = await getPage(pageId);\n\n if (!page) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"Could not find the page, check you have the correct page ID and release ID.\",\n },\n ],\n };\n }\n\n if (responseFormat === \"markdown\") {\n return {\n content: [\n {\n type: \"text\",\n text: formatPageAsMarkdown(page),\n mimeType: \"text/markdown\",\n },\n ],\n };\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(page, null, 2),\n mimeType: \"application/json\",\n },\n ],\n };\n },\n );\n}\n"],"names":[],"mappings":"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","debug_id":"4287cdf1-ffbe-5acb-8d13-fd2ad1a3cdd7"}
|
package/dist/tools/styleguide.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Styleguide Tools
|
|
3
3
|
*/
|
|
4
|
+
|
|
5
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="df781019-a836-5ef6-a5af-e1d5efd4c9fb")}catch(e){}}();
|
|
4
6
|
import z from "zod";
|
|
5
7
|
import { getStyleguideTree, listStyleguides } from "../api/styleguide.js";
|
|
6
8
|
import { DEFAULT_NAME, formatStyleguideListAsMarkdown, formatTreeAsJson, } from "../common/formatters/styleguide.js";
|
|
@@ -92,3 +94,5 @@ export function registerGetStyleguideTreeTool(server) {
|
|
|
92
94
|
}
|
|
93
95
|
});
|
|
94
96
|
}
|
|
97
|
+
//# sourceMappingURL=styleguide.js.map
|
|
98
|
+
//# debugId=df781019-a836-5ef6-a5af-e1d5efd4c9fb
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styleguide.js","sources":["tools/styleguide.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Styleguide Tools\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { ResourceLink } from \"@modelcontextprotocol/sdk/types.js\";\nimport z from \"zod\";\n\nimport { getStyleguideTree, listStyleguides } from \"../api/styleguide.js\";\nimport {\n DEFAULT_NAME,\n formatStyleguideListAsMarkdown,\n formatTreeAsJson,\n} from \"../common/formatters/styleguide.js\";\n\nexport function registerListStyleguidesTool(server: McpServer) {\n server.registerTool(\n \"list-styleguides\",\n {\n title: \"List styleguides\",\n description: \"List all accessible styleguides as resource links\",\n inputSchema: {\n responseType: z\n .enum([\"markdown\", \"resource_links\"])\n .default(\"markdown\"),\n },\n },\n async ({ responseType }) => {\n const styleguides = await listStyleguides();\n\n if (styleguides.length === 0) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"There are no accessible styleguides. Check your auth credentials and make sure you have at least one styleguide in zeroheight.\",\n },\n ],\n };\n }\n\n if (responseType === \"markdown\") {\n return {\n content: [\n {\n type: \"text\",\n text: formatStyleguideListAsMarkdown(styleguides),\n mimeType: \"text/markdown\",\n },\n ],\n };\n }\n\n const resourceLinks: ResourceLink[] = styleguides.map((styleguide) => ({\n type: \"resource_link\",\n uri: `zeroheight://styleguide/${styleguide.id}`,\n name: styleguide.name ?? DEFAULT_NAME,\n _meta: {\n shareId: styleguide.share_id,\n id: styleguide.id,\n },\n mimeType: \"application/json\",\n description: \"Navigation structure for the styleguide\",\n }));\n\n return {\n content: [\n {\n type: \"text\",\n text: `There are available ${styleguides.length} styleguides`,\n },\n ...resourceLinks,\n ],\n };\n },\n );\n}\n\nexport function registerGetStyleguideTreeTool(server: McpServer) {\n server.registerTool(\n \"get-styleguide-tree\",\n {\n title: \"Get styleguide tree\",\n description:\n \"A navigation hierarchy for a styleguide with top-level navigation, categories, pages and tabs\",\n inputSchema: {\n styleguideId: z.number().int().positive(),\n },\n },\n async ({ styleguideId }) => {\n try {\n const tree = await getStyleguideTree(styleguideId);\n const formattedTree = formatTreeAsJson(tree);\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(formattedTree, null, 2),\n },\n ],\n };\n } catch {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: \"Could not get the navigation tree for this styleguide.\",\n },\n ],\n };\n }\n },\n );\n}\n"],"names":[],"mappings":"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","debug_id":"df781019-a836-5ef6-a5af-e1d5efd4c9fb"}
|
package/package.json
CHANGED
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zeroheight/mcp-server",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "MCP server for zeroheight",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"mcp-server": "dist/index.js"
|
|
8
8
|
},
|
|
9
9
|
"scripts": {
|
|
10
|
-
"build": "tsc && chmod 755 dist/index.js",
|
|
10
|
+
"build": "tsc && chmod 755 dist/index.js && npm run sentry:sourcemaps",
|
|
11
|
+
"dev": "tsc && chmod 755 dist/index.js",
|
|
11
12
|
"start": "node dist/index.js",
|
|
12
13
|
"cleanup": "rm -rf dist",
|
|
13
14
|
"lint": "prettier --write .",
|
|
14
|
-
"test": "rstest"
|
|
15
|
+
"test": "rstest",
|
|
16
|
+
"sentry:sourcemaps": "sentry-cli sourcemaps inject --org zeroheight --project mcp-server ./dist && sentry-cli sourcemaps upload --org zeroheight --project mcp-server ./dist"
|
|
15
17
|
},
|
|
16
18
|
"engines": {
|
|
17
19
|
"node": ">= 22"
|
|
@@ -29,6 +31,8 @@
|
|
|
29
31
|
"homepage": "https://zeroheight.com",
|
|
30
32
|
"dependencies": {
|
|
31
33
|
"@modelcontextprotocol/sdk": "^1.17.1",
|
|
34
|
+
"@sentry/cli": "^2.52.0",
|
|
35
|
+
"@sentry/node": "^10.5.0",
|
|
32
36
|
"zod": "^3.25.76"
|
|
33
37
|
},
|
|
34
38
|
"devDependencies": {
|