@o3r/mcp 13.3.0-prerelease.1 → 13.3.0-prerelease.10

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.
Files changed (35) hide show
  1. package/package.json +9 -9
  2. package/src/best-practices/index.d.ts +8 -0
  3. package/src/best-practices/index.d.ts.map +1 -0
  4. package/src/best-practices/index.js +52 -0
  5. package/src/best-practices/index.js.map +1 -0
  6. package/src/mcp-server.d.ts.map +1 -1
  7. package/src/mcp-server.js +11 -6
  8. package/src/mcp-server.js.map +1 -1
  9. package/src/release-notes/index.d.ts +7 -0
  10. package/src/release-notes/index.d.ts.map +1 -0
  11. package/src/release-notes/index.js +84 -0
  12. package/src/release-notes/index.js.map +1 -0
  13. package/src/tools/find-repositories-using-otter.d.ts.map +1 -1
  14. package/src/tools/find-repositories-using-otter.js +62 -29
  15. package/src/tools/find-repositories-using-otter.js.map +1 -1
  16. package/src/tools/supported-releases.d.ts +7 -0
  17. package/src/tools/supported-releases.d.ts.map +1 -0
  18. package/src/tools/supported-releases.js +46 -0
  19. package/src/tools/supported-releases.js.map +1 -0
  20. package/src/utils/otter.d.ts +17 -0
  21. package/src/utils/otter.d.ts.map +1 -0
  22. package/src/utils/otter.js +25 -0
  23. package/src/utils/otter.js.map +1 -0
  24. package/src/utils/resource-registry.d.ts +7 -0
  25. package/src/utils/resource-registry.d.ts.map +1 -0
  26. package/src/utils/resource-registry.js +10 -0
  27. package/src/utils/resource-registry.js.map +1 -0
  28. package/src/instructions/best-practices.d.ts +0 -8
  29. package/src/instructions/best-practices.d.ts.map +0 -1
  30. package/src/instructions/best-practices.js +0 -24
  31. package/src/instructions/best-practices.js.map +0 -1
  32. package/src/tools/best-practices.d.ts +0 -8
  33. package/src/tools/best-practices.d.ts.map +0 -1
  34. package/src/tools/best-practices.js +0 -27
  35. package/src/tools/best-practices.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@o3r/mcp",
3
- "version": "13.3.0-prerelease.1",
3
+ "version": "13.3.0-prerelease.10",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -39,17 +39,17 @@
39
39
  "@nx/eslint-plugin": "~21.6.0",
40
40
  "@nx/jest": "~21.6.0",
41
41
  "@nx/js": "~21.6.0",
42
- "@o3r/build-helpers": "^13.3.0-prerelease.1",
43
- "@o3r/eslint-config": "^13.3.0-prerelease.1",
44
- "@o3r/eslint-plugin": "^13.3.0-prerelease.1",
45
- "@o3r/test-helpers": "^13.3.0-prerelease.1",
46
- "@stylistic/eslint-plugin": "~5.3.0",
42
+ "@o3r/build-helpers": "^13.3.0-prerelease.10",
43
+ "@o3r/eslint-config": "^13.3.0-prerelease.10",
44
+ "@o3r/eslint-plugin": "^13.3.0-prerelease.10",
45
+ "@o3r/test-helpers": "^13.3.0-prerelease.10",
46
+ "@stylistic/eslint-plugin": "~5.4.0",
47
47
  "@types/jest": "~29.5.2",
48
48
  "@types/node": "~22.18.0",
49
- "@typescript-eslint/parser": "~8.43.0",
49
+ "@typescript-eslint/parser": "~8.46.0",
50
50
  "angular-eslint": "~20.3.0",
51
51
  "cpy-cli": "^6.0.0",
52
- "eslint": "~9.35.0",
52
+ "eslint": "~9.37.0",
53
53
  "eslint-import-resolver-node": "~0.3.9",
54
54
  "eslint-import-resolver-typescript": "~4.4.0",
55
55
  "eslint-plugin-import": "~2.32.0",
@@ -72,7 +72,7 @@
72
72
  "ts-node": "~10.9.2",
73
73
  "type-fest": "^4.30.1",
74
74
  "typescript": "~5.9.2",
75
- "typescript-eslint": "~8.43.0",
75
+ "typescript-eslint": "~8.46.0",
76
76
  "zone.js": "~0.15.0"
77
77
  },
78
78
  "engines": {
@@ -0,0 +1,8 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ /**
3
+ * Register the best practices tool and resources.
4
+ * @param server
5
+ * @param resourcesPath
6
+ */
7
+ export declare function registerBestPracticesToolAndResources(server: McpServer, resourcesPath: string): Promise<[PromiseSettledResult<void>, PromiseSettledResult<void>]>;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/best-practices/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,SAAS,EACV,MAAM,yCAAyC,CAAC;AA6DjD;;;;GAIG;AACH,wBAAgB,qCAAqC,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,qEAM7F"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerBestPracticesToolAndResources = registerBestPracticesToolAndResources;
4
+ const promises_1 = require("node:fs/promises");
5
+ const node_path_1 = require("node:path");
6
+ const otter_1 = require("../utils/otter");
7
+ const resource_registry_1 = require("../utils/resource-registry");
8
+ const uri = `${otter_1.uriPrefix}best-practices`;
9
+ async function registerBestPracticesResources(server, bestPracticesResourcesPath) {
10
+ const content = await (0, promises_1.readFile)((0, node_path_1.join)(bestPracticesResourcesPath, 'output.md'), { encoding: 'utf8' });
11
+ resource_registry_1.resourceRegistry.set(uri, content);
12
+ server.registerResource('Best Practices Guide', uri, {
13
+ title: 'Otter Best Practices and Code Generation Guide',
14
+ description: await (0, promises_1.readFile)((0, node_path_1.join)(bestPracticesResourcesPath, 'description.md'), { encoding: 'utf8' }),
15
+ mimeType: 'text/markdown'
16
+ }, () => ({ contents: [{ uri, text: content }] }));
17
+ }
18
+ async function registerBestPracticesTool(server, bestPracticesResourcesPath) {
19
+ server.registerTool('get_best_practices', {
20
+ title: 'Get Otter Coding Best Practices Guide',
21
+ description: await (0, promises_1.readFile)((0, node_path_1.join)(bestPracticesResourcesPath, 'description.md'), { encoding: 'utf8' }),
22
+ annotations: {
23
+ readOnlyHint: true,
24
+ openWorldHint: false
25
+ }
26
+ }, () => ({
27
+ content: [
28
+ {
29
+ type: 'text',
30
+ text: resource_registry_1.resourceRegistry.get(uri) || 'Not found'
31
+ },
32
+ {
33
+ type: 'resource_link',
34
+ name: 'Best practices',
35
+ uri
36
+ }
37
+ ]
38
+ }));
39
+ }
40
+ /**
41
+ * Register the best practices tool and resources.
42
+ * @param server
43
+ * @param resourcesPath
44
+ */
45
+ function registerBestPracticesToolAndResources(server, resourcesPath) {
46
+ const bestPracticesResourcesPath = (0, node_path_1.join)(resourcesPath, 'best-practices');
47
+ return Promise.allSettled([
48
+ registerBestPracticesResources(server, bestPracticesResourcesPath),
49
+ registerBestPracticesTool(server, bestPracticesResourcesPath)
50
+ ]);
51
+ }
52
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/best-practices/index.ts"],"names":[],"mappings":";;AA0EA,sFAMC;AAhFD,+CAE0B;AAC1B,yCAEmB;AAInB,0CAEwB;AACxB,kEAEoC;AAEpC,MAAM,GAAG,GAAG,GAAG,iBAAS,gBAAgB,CAAC;AAEzC,KAAK,UAAU,8BAA8B,CAAC,MAAiB,EAAE,0BAAkC;IACjG,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAC5B,IAAA,gBAAI,EAAC,0BAA0B,EAAE,WAAW,CAAC,EAC7C,EAAE,QAAQ,EAAE,MAAM,EAAE,CACrB,CAAC;IACF,oCAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACnC,MAAM,CAAC,gBAAgB,CACrB,sBAAsB,EACtB,GAAG,EACH;QACE,KAAK,EAAE,gDAAgD;QACvD,WAAW,EAAE,MAAM,IAAA,mBAAQ,EACzB,IAAA,gBAAI,EAAC,0BAA0B,EAAE,gBAAgB,CAAC,EAClD,EAAE,QAAQ,EAAE,MAAM,EAAE,CACrB;QACD,QAAQ,EAAE,eAAe;KAC1B,EACD,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAC/C,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,yBAAyB,CAAC,MAAiB,EAAE,0BAAkC;IAC5F,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,KAAK,EAAE,uCAAuC;QAC9C,WAAW,EAAE,MAAM,IAAA,mBAAQ,EACzB,IAAA,gBAAI,EAAC,0BAA0B,EAAE,gBAAgB,CAAC,EAClD,EAAE,QAAQ,EAAE,MAAM,EAAE,CACrB;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,GAAG,EAAE,CAAC,CAAC;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,oCAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,WAAW;aAC/C;YACD;gBACE,IAAI,EAAE,eAAe;gBACrB,IAAI,EAAE,gBAAgB;gBACtB,GAAG;aACJ;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAgB,qCAAqC,CAAC,MAAiB,EAAE,aAAqB;IAC5F,MAAM,0BAA0B,GAAG,IAAA,gBAAI,EAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;IACzE,OAAO,OAAO,CAAC,UAAU,CAAC;QACxB,8BAA8B,CAAC,MAAM,EAAE,0BAA0B,CAAC;QAClE,yBAAyB,CAAC,MAAM,EAAE,0BAA0B,CAAC;KAC9D,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/mcp-server.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,SAAS,EACV,MAAM,yCAAyC,CAAC;AAcjD;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,SAAS,CAAC,CAiB1D"}
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/mcp-server.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,SAAS,EACV,MAAM,yCAAyC,CAAC;AAiBjD;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,SAAS,CAAC,CAqB1D"}
package/src/mcp-server.js CHANGED
@@ -4,10 +4,11 @@ exports.createMcpServer = createMcpServer;
4
4
  const promises_1 = require("node:fs/promises");
5
5
  const node_path_1 = require("node:path");
6
6
  const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
7
- const best_practices_1 = require("./instructions/best-practices");
8
- const best_practices_2 = require("./tools/best-practices");
7
+ const best_practices_1 = require("./best-practices");
8
+ const release_notes_1 = require("./release-notes");
9
9
  const create_monorepo_with_app_1 = require("./tools/create-monorepo-with-app");
10
10
  const find_repositories_using_otter_1 = require("./tools/find-repositories-using-otter");
11
+ const supported_releases_1 = require("./tools/supported-releases");
11
12
  /**
12
13
  * Create an MCP server instance.
13
14
  */
@@ -22,10 +23,14 @@ async function createMcpServer() {
22
23
  }
23
24
  });
24
25
  const resourcesPath = (0, node_path_1.join)(__dirname, '..', 'resources');
25
- await (0, best_practices_1.registerBestPracticesResources)(server, resourcesPath);
26
- await (0, best_practices_2.registerBestPracticesTool)(server, resourcesPath);
27
- await (0, create_monorepo_with_app_1.registerCreateMonorepoWithAppTool)(server, resourcesPath);
28
- (0, find_repositories_using_otter_1.registerGetRepositoriesUsingOtterTool)(server);
26
+ await Promise.allSettled([
27
+ (0, release_notes_1.registerReleaseNotes)(server),
28
+ (0, best_practices_1.registerBestPracticesToolAndResources)(server, resourcesPath),
29
+ (0, create_monorepo_with_app_1.registerCreateMonorepoWithAppTool)(server, resourcesPath),
30
+ // eslint-disable-next-line @typescript-eslint/await-thenable -- Awaiting a non-promise value
31
+ (0, find_repositories_using_otter_1.registerGetRepositoriesUsingOtterTool)(server),
32
+ (0, supported_releases_1.registerSupportedReleaseTool)(server)
33
+ ]);
29
34
  return server;
30
35
  }
31
36
  //# sourceMappingURL=mcp-server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../src/mcp-server.ts"],"names":[],"mappings":";;AAyBA,0CAiBC;AA1CD,+CAE0B;AAC1B,yCAEmB;AACnB,oEAEiD;AACjD,kEAEuC;AACvC,2DAEgC;AAChC,+EAE0C;AAC1C,yFAE+C;AAE/C;;GAEG;AACI,KAAK,UAAU,eAAe;IACnC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAA,mBAAQ,EAAC,IAAA,gBAAI,EAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAsC,CAAC;IACzI,MAAM,MAAM,GAAG,IAAI,kBAAS,CAAC;QAC3B,IAAI;QACJ,OAAO;QACP,YAAY,EAAE;YACZ,SAAS,EAAE,EAAE;YACb,KAAK,EAAE,EAAE;SACV;KACF,CAAC,CAAC;IACH,MAAM,aAAa,GAAG,IAAA,gBAAI,EAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IAEzD,MAAM,IAAA,+CAA8B,EAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC5D,MAAM,IAAA,0CAAyB,EAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACvD,MAAM,IAAA,4DAAiC,EAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC/D,IAAA,qEAAqC,EAAC,MAAM,CAAC,CAAC;IAC9C,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../src/mcp-server.ts"],"names":[],"mappings":";;AA4BA,0CAqBC;AAjDD,+CAE0B;AAC1B,yCAEmB;AACnB,oEAEiD;AACjD,qDAE0B;AAC1B,mDAEyB;AACzB,+EAE0C;AAC1C,yFAE+C;AAC/C,mEAEoC;AAEpC;;GAEG;AACI,KAAK,UAAU,eAAe;IACnC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAA,mBAAQ,EAAC,IAAA,gBAAI,EAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAsC,CAAC;IACzI,MAAM,MAAM,GAAG,IAAI,kBAAS,CAAC;QAC3B,IAAI;QACJ,OAAO;QACP,YAAY,EAAE;YACZ,SAAS,EAAE,EAAE;YACb,KAAK,EAAE,EAAE;SACV;KACF,CAAC,CAAC;IACH,MAAM,aAAa,GAAG,IAAA,gBAAI,EAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IAEzD,MAAM,OAAO,CAAC,UAAU,CAAC;QACvB,IAAA,oCAAoB,EAAC,MAAM,CAAC;QAC5B,IAAA,sDAAqB,EAAC,MAAM,EAAE,aAAa,CAAC;QAC5C,IAAA,4DAAiC,EAAC,MAAM,EAAE,aAAa,CAAC;QACxD,6FAA6F;QAC7F,IAAA,qEAAqC,EAAC,MAAM,CAAC;QAC7C,IAAA,iDAA4B,EAAC,MAAM,CAAC;KACrC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { type McpServer } from '@modelcontextprotocol/sdk/server/mcp';
2
+ /**
3
+ * Register the release notes tool and resources.
4
+ * @param server
5
+ */
6
+ export declare function registerReleaseNotes(server: McpServer): Promise<void>;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/release-notes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EAEf,MAAM,sCAAsC,CAAC;AA+F9C;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,SAAS,iBAW3D"}
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerReleaseNotes = registerReleaseNotes;
4
+ const mcp_1 = require("@modelcontextprotocol/sdk/server/mcp");
5
+ const rest_1 = require("@octokit/rest");
6
+ const zod_1 = require("zod");
7
+ const logger_1 = require("../utils/logger");
8
+ const otter_1 = require("../utils/otter");
9
+ const resource_registry_1 = require("../utils/resource-registry");
10
+ const getUri = (tagName) => `${otter_1.uriPrefix}release-notes/${tagName}`;
11
+ const formatContent = (releaseNote) => `# ${releaseNote.tag_name}\n\n${releaseNote.body}`;
12
+ async function getReleaseNotes(octokit) {
13
+ const minorsReleaseNotes = (await octokit.paginate(octokit.repos.listReleases, { owner: otter_1.owner, repo: otter_1.repo }))
14
+ .filter((release) => /^v\d+\.\d+\.0$/.test(release.tag_name));
15
+ const releaseNotes = new Map(minorsReleaseNotes.map((releaseNote) => [releaseNote.tag_name, releaseNote]));
16
+ releaseNotes.forEach((value) => resource_registry_1.resourceRegistry.set(getUri(value.tag_name), formatContent(value)));
17
+ return releaseNotes;
18
+ }
19
+ function registerReleaseNotesResources(server, releaseNotes) {
20
+ server.registerResource(`Otter release notes`, new mcp_1.ResourceTemplate(getUri('{tagName}'), {
21
+ list: undefined,
22
+ complete: {
23
+ tagName: (value) => {
24
+ const tagNames = Array.from(releaseNotes.keys());
25
+ return tagNames.filter((tagName) => tagName.startsWith(value));
26
+ }
27
+ }
28
+ }), {
29
+ description: `${otter_1.owner}/${otter_1.repo}'s release notes`,
30
+ mimeType: 'text/markdown'
31
+ }, (uri, { tagName }) => ({
32
+ contents: [({
33
+ uri: uri.href,
34
+ text: formatContent(releaseNotes.get(tagName)),
35
+ mimeType: 'text/markdown'
36
+ })]
37
+ }));
38
+ }
39
+ function registerReleaseNotesTool(server, releaseNotes) {
40
+ server.registerTool('get_release_notes', {
41
+ title: 'Get Otter release notes',
42
+ description: 'Get the release notes for the latest Otter releases',
43
+ annotations: {
44
+ readOnlyHint: true,
45
+ openWorldHint: false
46
+ },
47
+ inputSchema: {
48
+ version: zod_1.z.string().optional()
49
+ .describe('The version of the release notes to get, if not provided all release notes will be returned. Format to use is vX.Y.0, e.g. v13.1.0')
50
+ }
51
+ }, ({ version }) => {
52
+ const targetedReleaseNote = version && releaseNotes.get(version);
53
+ return {
54
+ content: (targetedReleaseNote ? [targetedReleaseNote] : Array.from(releaseNotes.values()))
55
+ .flatMap((releaseNote) => {
56
+ const uri = getUri(releaseNote.tag_name);
57
+ return [{
58
+ type: 'text',
59
+ text: resource_registry_1.resourceRegistry.get(uri) || 'Not found'
60
+ }, {
61
+ type: 'resource_link',
62
+ name: `Release note ${releaseNote.tag_name}`,
63
+ uri
64
+ }];
65
+ })
66
+ };
67
+ });
68
+ }
69
+ /**
70
+ * Register the release notes tool and resources.
71
+ * @param server
72
+ */
73
+ async function registerReleaseNotes(server) {
74
+ if (!process.env.O3R_MCP_GITHUB_TOKEN) {
75
+ logger_1.logger.error('Missing O3R_MCP_GITHUB_TOKEN environment variable for get_release_notes tool');
76
+ return;
77
+ }
78
+ const octokit = new rest_1.Octokit({ auth: process.env.O3R_MCP_GITHUB_TOKEN });
79
+ const releaseNotes = await getReleaseNotes(octokit);
80
+ logger_1.logger.info(`Found ${releaseNotes.size} release notes`, releaseNotes);
81
+ registerReleaseNotesResources(server, releaseNotes);
82
+ registerReleaseNotesTool(server, releaseNotes);
83
+ }
84
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/release-notes/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"find-repositories-using-otter.d.ts","sourceRoot":"","sources":["../../../src/tools/find-repositories-using-otter.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,SAAS,EACV,MAAM,yCAAyC,CAAC;AAgIjD;;;GAGG;AACH,wBAAgB,qCAAqC,CAAC,MAAM,EAAE,SAAS,QA0CtE"}
1
+ {"version":3,"file":"find-repositories-using-otter.d.ts","sourceRoot":"","sources":["../../../src/tools/find-repositories-using-otter.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,SAAS,EACV,MAAM,yCAAyC,CAAC;AAkLjD;;;GAGG;AACH,wBAAgB,qCAAqC,CAAC,MAAM,EAAE,SAAS,QA4CtE"}
@@ -5,21 +5,30 @@ const node_fs_1 = require("node:fs");
5
5
  const promises_1 = require("node:fs/promises");
6
6
  const node_path_1 = require("node:path");
7
7
  const rest_1 = require("@octokit/rest");
8
+ const zod_1 = require("zod");
8
9
  const logger_1 = require("../utils/logger");
9
- async function listOrgRepos(octokit) {
10
- const repos = (await octokit.paginate(octokit.repos.listForOrg, {
11
- org: process.env.O3R_MCP_GITHUB_ORG,
12
- per_page: 100,
13
- type: 'all',
14
- sort: 'updated' // Prioritize recently updated repositories
15
- })).filter((repo) => !repo.archived && !repo.fork);
16
- logger_1.logger.info(`Found ${repos.length} repositories in the organization ${process.env.O3R_MCP_GITHUB_ORG}`);
17
- return repos;
10
+ const otter_1 = require("../utils/otter");
11
+ async function listRepos(octokit) {
12
+ // We use several requests and not only one with OR
13
+ // because GitHub search API has some limitations in the query length and complexity
14
+ // Note: We can do only 10 searches per minute,
15
+ // so we should found another solution if we have more than 10 scopes to look for.
16
+ const search = (await Promise.all(otter_1.OTTER_SCOPES
17
+ .map(async (scope) => {
18
+ const repos = (await octokit.paginate(octokit.search.code, { q: `@${scope}/ filename:package.json`, per_page: 100 }));
19
+ // eslint-disable-next-line @typescript-eslint/naming-convention -- Naming convention from GitHub API
20
+ const reposWithOnlyNeededInfo = repos.map(({ repository: { name, full_name, fork, archived, default_branch } }) => ({ name, full_name, fork, archived, default_branch }));
21
+ const filteredRepos = reposWithOnlyNeededInfo.filter((repo) => !repo.archived && !repo.fork);
22
+ logger_1.logger.info(`Found ${filteredRepos.length} repositories with references to @${scope} in package.json`);
23
+ return filteredRepos;
24
+ }))).flat();
25
+ const repositories = Array.from(new Map(search.map(({ fork, archived, ...repo }) => [repo.full_name, repo])).values());
26
+ logger_1.logger.info(`Found ${repositories.length} repositories with references to Otter`);
27
+ return repositories;
18
28
  }
19
29
  function findPackageJsonFiles(octokit) {
20
30
  return async (repository) => {
21
- const owner = process.env.O3R_MCP_GITHUB_ORG;
22
- const repo = repository.name;
31
+ const [owner, repo] = repository.full_name.split('/');
23
32
  const { data: { commit: { sha } } } = await octokit.repos.getBranch({
24
33
  owner,
25
34
  repo,
@@ -33,17 +42,16 @@ function findPackageJsonFiles(octokit) {
33
42
  return tree.filter((t) => t.type === 'blob' && t.path.endsWith('package.json'));
34
43
  };
35
44
  }
36
- const O3R_SCOPE_REGEX = /^@(o3r|ama-styling|ama-mfe|ama-sdk)\//gm;
45
+ const O3R_SCOPE_REGEX = new RegExp(`^@(?:${otter_1.OTTER_SCOPES.join('|')})/`, 'gm');
37
46
  function dependsOnOtter(octokit) {
38
47
  return async (repository, packageJsonPath) => {
39
- const owner = process.env.O3R_MCP_GITHUB_ORG;
40
- const repo = repository.name;
48
+ const [owner, repo] = repository.full_name.split('/');
41
49
  const { data } = await octokit.repos.getContent({
42
50
  owner,
43
51
  repo,
44
52
  path: packageJsonPath
45
53
  });
46
- if (Array.isArray(data) || data.type !== 'file') {
54
+ if (Array.isArray(data) || data.type !== 'file' || data.encoding !== 'base64') {
47
55
  throw new Error('Unexpected content response structure');
48
56
  }
49
57
  const content = Buffer.from(data.content, 'base64').toString('utf8');
@@ -54,6 +62,19 @@ function dependsOnOtter(octokit) {
54
62
  ].some((dep) => O3R_SCOPE_REGEX.test(dep));
55
63
  };
56
64
  }
65
+ const DEFAULT_O3R_MCP_CACHE_MAX_AGE = 90;
66
+ const convertDaysToMs = (days) => days * 1000 * 60 * 60 * 24;
67
+ function validateCache(cachedRepos) {
68
+ const now = Date.now();
69
+ const maxAge = convertDaysToMs(+(process.env.O3R_MCP_CACHE_MAX_AGE || DEFAULT_O3R_MCP_CACHE_MAX_AGE));
70
+ Object.entries(cachedRepos).forEach(([repo, { when }]) => {
71
+ const whenDate = new Date(when);
72
+ if (Number.isNaN(whenDate.getTime()) || (now - whenDate.getTime()) > maxAge) {
73
+ logger_1.logger.info(`Cache for repository ${repo} is outdated or invalid, removing it`);
74
+ delete cachedRepos[repo];
75
+ }
76
+ });
77
+ }
57
78
  async function findRepositoriesUsingOtter(octokit, reposUsingOtter) {
58
79
  const cacheFolderPath = process.env.O3R_MCP_CACHE_PATH || '.cache/o3r/mcp';
59
80
  const cachePath = (0, node_path_1.resolve)(cacheFolderPath, 'repos-using-otter.json');
@@ -64,6 +85,7 @@ async function findRepositoriesUsingOtter(octokit, reposUsingOtter) {
64
85
  else {
65
86
  try {
66
87
  cachedRepos = JSON.parse(await (0, promises_1.readFile)(cachePath, { encoding: 'utf8' }));
88
+ validateCache(cachedRepos);
67
89
  reposUsingOtter.push(...Object.entries(cachedRepos).filter(([, usesOtter]) => usesOtter).map(([repo]) => repo));
68
90
  logger_1.logger.info(`Loaded ${Object.keys(cachedRepos).length} cached repositories, ${reposUsingOtter.length} of them using Otter dependencies.`);
69
91
  }
@@ -71,7 +93,7 @@ async function findRepositoriesUsingOtter(octokit, reposUsingOtter) {
71
93
  logger_1.logger.info('No cache file found, starting fresh search for repositories using Otter dependencies.', e);
72
94
  }
73
95
  }
74
- const repositories = (await listOrgRepos(octokit)).filter((r) => !cachedRepos[r.full_name]);
96
+ const repositories = (await listRepos(octokit)).filter((r) => !cachedRepos[r.full_name]?.dependsOn);
75
97
  const findPackageJsonFilesInRepo = findPackageJsonFiles(octokit);
76
98
  const dependsOnOtterInRepo = dependsOnOtter(octokit);
77
99
  await Promise.allSettled(repositories.map(async (repository) => {
@@ -85,7 +107,10 @@ async function findRepositoriesUsingOtter(octokit, reposUsingOtter) {
85
107
  }
86
108
  if (packageJsonFiles.length === 0) {
87
109
  logger_1.logger.info(`No package.json files found in repository ${repository.full_name}`);
88
- cachedRepos[repository.full_name] = false;
110
+ cachedRepos[repository.full_name] = {
111
+ dependsOn: false,
112
+ when: new Date().toISOString()
113
+ };
89
114
  return;
90
115
  }
91
116
  try {
@@ -100,7 +125,10 @@ async function findRepositoriesUsingOtter(octokit, reposUsingOtter) {
100
125
  if (depFound) {
101
126
  reposUsingOtter.push(repository.full_name);
102
127
  logger_1.logger.info(`Repository ${repository.full_name} uses Otter dependencies`);
103
- cachedRepos[repository.full_name] = true;
128
+ cachedRepos[repository.full_name] = {
129
+ dependsOn: true,
130
+ when: new Date().toISOString()
131
+ };
104
132
  }
105
133
  else {
106
134
  throw new Error('No Otter dependencies found in this package.json');
@@ -108,9 +136,12 @@ async function findRepositoriesUsingOtter(octokit, reposUsingOtter) {
108
136
  }));
109
137
  }
110
138
  catch { }
111
- cachedRepos[repository.full_name] ||= false;
139
+ cachedRepos[repository.full_name] ||= {
140
+ dependsOn: false,
141
+ when: new Date().toISOString()
142
+ };
112
143
  }));
113
- logger_1.logger.info(`Found ${reposUsingOtter.length} repositories using Otter dependencies in the organization ${process.env.O3R_MCP_GITHUB_ORG}`);
144
+ logger_1.logger.info(`Found ${reposUsingOtter.length} repositories using Otter dependencies`);
114
145
  if (process.env.O3R_MCP_USE_CACHED_REPOS === 'false') {
115
146
  logger_1.logger.info('Not updating cache as O3R_MCP_USE_CACHED_REPOS is set to false');
116
147
  }
@@ -119,7 +150,7 @@ async function findRepositoriesUsingOtter(octokit, reposUsingOtter) {
119
150
  await (0, promises_1.mkdir)(cacheFolderPath, { recursive: true });
120
151
  }
121
152
  try {
122
- await (0, promises_1.writeFile)(cachePath, JSON.stringify(cachedRepos, Object.keys(cachedRepos).sort()));
153
+ await (0, promises_1.writeFile)(cachePath, JSON.stringify(cachedRepos));
123
154
  }
124
155
  catch (e) {
125
156
  logger_1.logger.error('Failed to update cache', e);
@@ -135,10 +166,6 @@ function registerGetRepositoriesUsingOtterTool(server) {
135
166
  logger_1.logger.error('Missing O3R_MCP_GITHUB_TOKEN environment variable for search_code_example tool');
136
167
  return;
137
168
  }
138
- if (!process.env.O3R_MCP_GITHUB_ORG) {
139
- logger_1.logger.error('Missing O3R_MCP_GITHUB_ORG environment variable');
140
- return;
141
- }
142
169
  const octokit = new rest_1.Octokit({ auth: process.env.O3R_MCP_GITHUB_TOKEN });
143
170
  let isLookingForRepos = true;
144
171
  const reposUsingOtter = [];
@@ -148,10 +175,13 @@ function registerGetRepositoriesUsingOtterTool(server) {
148
175
  isLookingForRepos = false;
149
176
  server.registerTool('get_repositories_using_otter', {
150
177
  title: 'Get repositories using Otter dependencies',
151
- description: 'List all repositories in the specified GitHub organization that use Otter dependencies (@o3r/* or @ama-*/*) in their package.json files.',
178
+ description: `List all repositories that use Otter dependencies (${otter_1.OTTER_SCOPES.map((scope) => `@${scope}`).join(' or ')}) in their package.json files.`,
152
179
  annotations: {
153
180
  readOnlyHint: true,
154
181
  openWorldHint: false
182
+ },
183
+ outputSchema: {
184
+ repositories: zod_1.z.array(zod_1.z.string()).describe('List of repositories using Otter dependencies')
155
185
  }
156
186
  }, () => ({
157
187
  content: [
@@ -159,11 +189,14 @@ function registerGetRepositoriesUsingOtterTool(server) {
159
189
  type: 'text',
160
190
  text: (isLookingForRepos ? 'I did not finish to look for repositories. For the moment:\n' : '')
161
191
  + reposUsingOtter.length
162
- ? `The following repositories in the organization ${process.env.O3R_MCP_GITHUB_ORG} use Otter dependencies:\n`
192
+ ? `The following repositories use Otter dependencies:\n`
163
193
  + reposUsingOtter.sort().map((repo) => `- ${repo}`).join('\n')
164
- : `No repositories in the organization ${process.env.O3R_MCP_GITHUB_ORG} were found to use Otter dependencies.`
194
+ : `No repositories were found to use Otter dependencies.`
165
195
  }
166
- ]
196
+ ],
197
+ structuredContent: {
198
+ repositories: reposUsingOtter
199
+ }
167
200
  }));
168
201
  }
169
202
  //# sourceMappingURL=find-repositories-using-otter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"find-repositories-using-otter.js","sourceRoot":"","sources":["../../../src/tools/find-repositories-using-otter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"find-repositories-using-otter.js","sourceRoot":"","sources":["../../../src/tools/find-repositories-using-otter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ /**
3
+ * Register the create monorepo with app tool.
4
+ * @param server
5
+ */
6
+ export declare function registerSupportedReleaseTool(server: McpServer): Promise<void>;
7
+ //# sourceMappingURL=supported-releases.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supported-releases.d.ts","sourceRoot":"","sources":["../../../src/tools/supported-releases.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACV,MAAM,yCAAyC,CAAC;AAwBjD;;;GAGG;AACH,wBAAsB,4BAA4B,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAgCnF"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerSupportedReleaseTool = registerSupportedReleaseTool;
4
+ const rest_1 = require("@octokit/rest");
5
+ const zod_1 = require("zod");
6
+ const logger_1 = require("../utils/logger");
7
+ const otter_1 = require("../utils/otter");
8
+ async function getSupportedReleases(octokit) {
9
+ const supportedReleases = (await octokit.paginate(octokit.repos.listBranches, { owner: otter_1.owner, repo: otter_1.repo }))
10
+ .filter((branch) => /^release\/\d+\.\d+$/.test(branch.name))
11
+ .map((branch) => branch.name.replace('release/', ''));
12
+ logger_1.logger.info(`Supported releases:\n${supportedReleases.map((r) => ` - ${r}`).join('\n')}`);
13
+ return supportedReleases;
14
+ }
15
+ /**
16
+ * Register the create monorepo with app tool.
17
+ * @param server
18
+ */
19
+ async function registerSupportedReleaseTool(server) {
20
+ if (!process.env.O3R_MCP_GITHUB_TOKEN) {
21
+ logger_1.logger.error('Missing O3R_MCP_GITHUB_TOKEN environment variable for get_supported_releases tool');
22
+ return;
23
+ }
24
+ const octokit = new rest_1.Octokit({ auth: process.env.O3R_MCP_GITHUB_TOKEN });
25
+ const supportedReleases = await getSupportedReleases(octokit);
26
+ server.registerTool('get_supported_releases', {
27
+ title: 'Get Otter Supported Releases',
28
+ description: 'Get the list of Otter supported releases',
29
+ outputSchema: {
30
+ releases: zod_1.z.array(zod_1.z.string()).describe('List of supported releases')
31
+ }
32
+ }, () => {
33
+ return {
34
+ content: [
35
+ {
36
+ type: 'text',
37
+ text: `The supported releases for Otter are: \n${supportedReleases.map((r) => ` - ${r}`).join('\n')}`
38
+ }
39
+ ],
40
+ structuredContent: {
41
+ releases: supportedReleases
42
+ }
43
+ };
44
+ });
45
+ }
46
+ //# sourceMappingURL=supported-releases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supported-releases.js","sourceRoot":"","sources":["../../../src/tools/supported-releases.ts"],"names":[],"mappings":";;AA8BA,oEAgCC;AA3DD,wCAEuB;AACvB,6BAEa;AACb,4CAEyB;AACzB,0CAGwB;AAExB,KAAK,UAAU,oBAAoB,CAAC,OAAgB;IAClD,MAAM,iBAAiB,GAAG,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,KAAK,EAAL,aAAK,EAAE,IAAI,EAAJ,YAAI,EAAE,CAAC,CAAC;SAC5F,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;SAC3D,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;IAExD,eAAM,CAAC,IAAI,CAAC,wBAAwB,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3F,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,4BAA4B,CAAC,MAAiB;IAClE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,CAAC;QACtC,eAAM,CAAC,KAAK,CAAC,mFAAmF,CAAC,CAAC;QAClG,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,cAAO,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,CAAC,CAAC;IACxE,MAAM,iBAAiB,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAE9D,MAAM,CAAC,YAAY,CACjB,wBAAwB,EACxB;QACE,KAAK,EAAE,8BAA8B;QACrC,WAAW,EAAE,0CAA0C;QACvD,YAAY,EAAE;YACZ,QAAQ,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC;SACrE;KACF,EACD,GAAG,EAAE;QACH,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,2CAA2C,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;iBACvG;aACF;YACD,iBAAiB,EAAE;gBACjB,QAAQ,EAAE,iBAAiB;aAC5B;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Otter repository organization
3
+ */
4
+ export declare const owner = "AmadeusITGroup";
5
+ /**
6
+ * Otter repository name
7
+ */
8
+ export declare const repo = "otter";
9
+ /**
10
+ * Otter related scopes
11
+ */
12
+ export declare const OTTER_SCOPES: string[];
13
+ /**
14
+ * Otter URI prefix
15
+ */
16
+ export declare const uriPrefix = "o3r://";
17
+ //# sourceMappingURL=otter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otter.d.ts","sourceRoot":"","sources":["../../../src/utils/otter.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,KAAK,mBAAmB,CAAC;AAEtC;;GAEG;AACH,eAAO,MAAM,IAAI,UAAU,CAAC;AAE5B;;GAEG;AACH,eAAO,MAAM,YAAY,UAKxB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,WAAW,CAAC"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.uriPrefix = exports.OTTER_SCOPES = exports.repo = exports.owner = void 0;
4
+ /**
5
+ * Otter repository organization
6
+ */
7
+ exports.owner = 'AmadeusITGroup';
8
+ /**
9
+ * Otter repository name
10
+ */
11
+ exports.repo = 'otter';
12
+ /**
13
+ * Otter related scopes
14
+ */
15
+ exports.OTTER_SCOPES = [
16
+ 'o3r',
17
+ 'ama-styling',
18
+ 'ama-mfe',
19
+ 'ama-sdk'
20
+ ];
21
+ /**
22
+ * Otter URI prefix
23
+ */
24
+ exports.uriPrefix = 'o3r://';
25
+ //# sourceMappingURL=otter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otter.js","sourceRoot":"","sources":["../../../src/utils/otter.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACU,QAAA,KAAK,GAAG,gBAAgB,CAAC;AAEtC;;GAEG;AACU,QAAA,IAAI,GAAG,OAAO,CAAC;AAE5B;;GAEG;AACU,QAAA,YAAY,GAAG;IAC1B,KAAK;IACL,aAAa;IACb,SAAS;IACT,SAAS;CACV,CAAC;AAEF;;GAEG;AACU,QAAA,SAAS,GAAG,QAAQ,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * A registry to store resources in memory and retrieve them by their URI.
3
+ * key: resource URI
4
+ * value: resource content
5
+ */
6
+ export declare const resourceRegistry: Map<string, string>;
7
+ //# sourceMappingURL=resource-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-registry.d.ts","sourceRoot":"","sources":["../../../src/utils/resource-registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,qBAA4B,CAAC"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resourceRegistry = void 0;
4
+ /**
5
+ * A registry to store resources in memory and retrieve them by their URI.
6
+ * key: resource URI
7
+ * value: resource content
8
+ */
9
+ exports.resourceRegistry = new Map();
10
+ //# sourceMappingURL=resource-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-registry.js","sourceRoot":"","sources":["../../../src/utils/resource-registry.ts"],"names":[],"mappings":";;;AAAA;;;;GAIG;AACU,QAAA,gBAAgB,GAAG,IAAI,GAAG,EAAkB,CAAC"}
@@ -1,8 +0,0 @@
1
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- /**
3
- * Register resources for best practices
4
- * @param server
5
- * @param resourcesPath
6
- */
7
- export declare function registerBestPracticesResources(server: McpServer, resourcesPath: string): Promise<void>;
8
- //# sourceMappingURL=best-practices.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"best-practices.d.ts","sourceRoot":"","sources":["../../../src/instructions/best-practices.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,SAAS,EACV,MAAM,yCAAyC,CAAC;AAEjD;;;;GAIG;AACH,wBAAsB,8BAA8B,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwB5G"}
@@ -1,24 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.registerBestPracticesResources = registerBestPracticesResources;
4
- const promises_1 = require("node:fs/promises");
5
- const node_path_1 = require("node:path");
6
- /**
7
- * Register resources for best practices
8
- * @param server
9
- * @param resourcesPath
10
- */
11
- async function registerBestPracticesResources(server, resourcesPath) {
12
- const bestPracticesResourcesPath = (0, node_path_1.join)(resourcesPath, 'best-practices');
13
- const name = 'instructions';
14
- const uri = `${name}://best-practices`;
15
- server.registerResource(name, uri, {
16
- title: 'Otter Best Practices and Code Generation Guide',
17
- description: await (0, promises_1.readFile)((0, node_path_1.join)(bestPracticesResourcesPath, 'description.md'), { encoding: 'utf8' }),
18
- mimeType: 'text/markdown'
19
- }, async () => {
20
- const text = await (0, promises_1.readFile)((0, node_path_1.join)(bestPracticesResourcesPath, 'output.md'), { encoding: 'utf8' });
21
- return { contents: [{ uri, text }] };
22
- });
23
- }
24
- //# sourceMappingURL=best-practices.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"best-practices.js","sourceRoot":"","sources":["../../../src/instructions/best-practices.ts"],"names":[],"mappings":";;AAeA,wEAwBC;AAvCD,+CAE0B;AAC1B,yCAEmB;AAKnB;;;;GAIG;AACI,KAAK,UAAU,8BAA8B,CAAC,MAAiB,EAAE,aAAqB;IAC3F,MAAM,0BAA0B,GAAG,IAAA,gBAAI,EAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;IACzE,MAAM,IAAI,GAAG,cAAc,CAAC;IAC5B,MAAM,GAAG,GAAG,GAAG,IAAI,mBAAmB,CAAC;IACvC,MAAM,CAAC,gBAAgB,CACrB,IAAI,EACJ,GAAG,EACH;QACE,KAAK,EAAE,gDAAgD;QACvD,WAAW,EAAE,MAAM,IAAA,mBAAQ,EACzB,IAAA,gBAAI,EAAC,0BAA0B,EAAE,gBAAgB,CAAC,EAClD,EAAE,QAAQ,EAAE,MAAM,EAAE,CACrB;QACD,QAAQ,EAAE,eAAe;KAC1B,EACD,KAAK,IAAI,EAAE;QACT,MAAM,IAAI,GAAG,MAAM,IAAA,mBAAQ,EACzB,IAAA,gBAAI,EAAC,0BAA0B,EAAE,WAAW,CAAC,EAC7C,EAAE,QAAQ,EAAE,MAAM,EAAE,CACrB,CAAC;QAEF,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACvC,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,8 +0,0 @@
1
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- /**
3
- * Register the best practices tool.
4
- * @param server
5
- * @param resourcesPath
6
- */
7
- export declare function registerBestPracticesTool(server: McpServer, resourcesPath: string): Promise<void>;
8
- //# sourceMappingURL=best-practices.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"best-practices.d.ts","sourceRoot":"","sources":["../../../src/tools/best-practices.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,SAAS,EACV,MAAM,yCAAyC,CAAC;AAEjD;;;;GAIG;AACH,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BvG"}
@@ -1,27 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.registerBestPracticesTool = registerBestPracticesTool;
4
- const promises_1 = require("node:fs/promises");
5
- const node_path_1 = require("node:path");
6
- /**
7
- * Register the best practices tool.
8
- * @param server
9
- * @param resourcesPath
10
- */
11
- async function registerBestPracticesTool(server, resourcesPath) {
12
- const bestPracticesResourcesPath = (0, node_path_1.join)(resourcesPath, 'best-practices');
13
- server.registerTool('get_best_practices', {
14
- title: 'Get Otter Coding Best Practices Guide',
15
- description: await (0, promises_1.readFile)((0, node_path_1.join)(bestPracticesResourcesPath, 'description.md'), { encoding: 'utf8' }),
16
- annotations: {
17
- readOnlyHint: true,
18
- openWorldHint: false
19
- }
20
- }, async () => {
21
- const bestPractices = await (0, promises_1.readFile)((0, node_path_1.join)(bestPracticesResourcesPath, 'output.md'), { encoding: 'utf8' });
22
- const developer = await (0, promises_1.readFile)((0, node_path_1.join)(resourcesPath, 'developer.md'), { encoding: 'utf8' });
23
- const text = [developer, bestPractices].join('\n\n');
24
- return { content: [{ type: 'text', text }] };
25
- });
26
- }
27
- //# sourceMappingURL=best-practices.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"best-practices.js","sourceRoot":"","sources":["../../../src/tools/best-practices.ts"],"names":[],"mappings":";;AAeA,8DA+BC;AA9CD,+CAE0B;AAC1B,yCAEmB;AAKnB;;;;GAIG;AACI,KAAK,UAAU,yBAAyB,CAAC,MAAiB,EAAE,aAAqB;IACtF,MAAM,0BAA0B,GAAG,IAAA,gBAAI,EAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;IAEzE,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,KAAK,EAAE,uCAAuC;QAC9C,WAAW,EAAE,MAAM,IAAA,mBAAQ,EACzB,IAAA,gBAAI,EAAC,0BAA0B,EAAE,gBAAgB,CAAC,EAClD,EAAE,QAAQ,EAAE,MAAM,EAAE,CACrB;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,IAAI,EAAE;QACT,MAAM,aAAa,GAAG,MAAM,IAAA,mBAAQ,EAClC,IAAA,gBAAI,EAAC,0BAA0B,EAAE,WAAW,CAAC,EAC7C,EAAE,QAAQ,EAAE,MAAM,EAAE,CACrB,CAAC;QACF,MAAM,SAAS,GAAG,MAAM,IAAA,mBAAQ,EAC9B,IAAA,gBAAI,EAAC,aAAa,EAAE,cAAc,CAAC,EACnC,EAAE,QAAQ,EAAE,MAAM,EAAE,CACrB,CAAC;QAEF,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAErD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAC/C,CAAC,CACF,CAAC;AACJ,CAAC"}