@google/gemini-cli 0.26.0-nightly.20260120.a90bcf749 → 0.26.0-preview.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.
Files changed (157) hide show
  1. package/dist/index.js +20 -0
  2. package/dist/index.js.map +1 -1
  3. package/dist/package.json +2 -2
  4. package/dist/src/commands/extensions/examples/hooks/gemini-extension.json +4 -0
  5. package/dist/src/commands/extensions/examples/hooks/hooks/hooks.json +14 -0
  6. package/dist/src/commands/extensions/examples/hooks/scripts/on-start.js +8 -0
  7. package/dist/src/commands/extensions/examples/mcp-server/README.md +35 -0
  8. package/dist/src/commands/extensions/examples/mcp-server/example.js +36 -22
  9. package/dist/src/commands/extensions/examples/mcp-server/gemini-extension.json +1 -1
  10. package/dist/src/commands/extensions/examples/mcp-server/package.json +0 -7
  11. package/dist/src/commands/extensions/examples/skills/gemini-extension.json +4 -0
  12. package/dist/src/commands/extensions/examples/skills/skills/greeter/SKILL.md +7 -0
  13. package/dist/src/commands/extensions.js +11 -10
  14. package/dist/src/commands/extensions.js.map +1 -1
  15. package/dist/src/commands/extensions.test.js +9 -9
  16. package/dist/src/commands/extensions.test.js.map +1 -1
  17. package/dist/src/commands/hooks/migrate.js +2 -2
  18. package/dist/src/commands/hooks/migrate.js.map +1 -1
  19. package/dist/src/commands/hooks/migrate.test.js +1 -1
  20. package/dist/src/commands/hooks/migrate.test.js.map +1 -1
  21. package/dist/src/commands/mcp/list.js +2 -1
  22. package/dist/src/commands/mcp/list.js.map +1 -1
  23. package/dist/src/commands/mcp/list.test.js +8 -1
  24. package/dist/src/commands/mcp/list.test.js.map +1 -1
  25. package/dist/src/commands/mcp.js +4 -3
  26. package/dist/src/commands/mcp.js.map +1 -1
  27. package/dist/src/commands/skills.js +6 -5
  28. package/dist/src/commands/skills.js.map +1 -1
  29. package/dist/src/commands/skills.test.js +5 -5
  30. package/dist/src/commands/skills.test.js.map +1 -1
  31. package/dist/src/config/config.js +5 -1
  32. package/dist/src/config/config.js.map +1 -1
  33. package/dist/src/config/extension-manager.d.ts +1 -0
  34. package/dist/src/config/extension-manager.js +3 -1
  35. package/dist/src/config/extension-manager.js.map +1 -1
  36. package/dist/src/config/extension.test.js +3 -3
  37. package/dist/src/config/extension.test.js.map +1 -1
  38. package/dist/src/config/keyBindings.js +16 -4
  39. package/dist/src/config/keyBindings.js.map +1 -1
  40. package/dist/src/config/keyBindings.test.js +20 -3
  41. package/dist/src/config/keyBindings.test.js.map +1 -1
  42. package/dist/src/config/settings.js +5 -0
  43. package/dist/src/config/settings.js.map +1 -1
  44. package/dist/src/config/settings.test.js +46 -0
  45. package/dist/src/config/settings.test.js.map +1 -1
  46. package/dist/src/config/settingsSchema.d.ts +22 -2
  47. package/dist/src/config/settingsSchema.js +22 -6
  48. package/dist/src/config/settingsSchema.js.map +1 -1
  49. package/dist/src/config/settingsSchema.test.js +12 -2
  50. package/dist/src/config/settingsSchema.test.js.map +1 -1
  51. package/dist/src/deferred.d.ts +19 -0
  52. package/dist/src/deferred.js +50 -0
  53. package/dist/src/deferred.js.map +1 -0
  54. package/dist/src/deferred.test.js +164 -0
  55. package/dist/src/deferred.test.js.map +1 -0
  56. package/dist/src/gemini.js +17 -11
  57. package/dist/src/gemini.js.map +1 -1
  58. package/dist/src/generated/git-commit.d.ts +2 -2
  59. package/dist/src/generated/git-commit.js +2 -2
  60. package/dist/src/generated/git-commit.js.map +1 -1
  61. package/dist/src/test-utils/render.js +1 -0
  62. package/dist/src/test-utils/render.js.map +1 -1
  63. package/dist/src/ui/AppContainer.js +10 -5
  64. package/dist/src/ui/AppContainer.js.map +1 -1
  65. package/dist/src/ui/commands/agentsCommand.js +5 -5
  66. package/dist/src/ui/commands/agentsCommand.js.map +1 -1
  67. package/dist/src/ui/commands/agentsCommand.test.js +2 -2
  68. package/dist/src/ui/commands/agentsCommand.test.js.map +1 -1
  69. package/dist/src/ui/commands/clearCommand.js +10 -6
  70. package/dist/src/ui/commands/clearCommand.js.map +1 -1
  71. package/dist/src/ui/commands/hooksCommand.js +10 -10
  72. package/dist/src/ui/commands/hooksCommand.js.map +1 -1
  73. package/dist/src/ui/commands/hooksCommand.test.js +9 -9
  74. package/dist/src/ui/commands/hooksCommand.test.js.map +1 -1
  75. package/dist/src/ui/components/Composer.test.js +2 -1
  76. package/dist/src/ui/components/Composer.test.js.map +1 -1
  77. package/dist/src/ui/components/DebugProfiler.js +16 -1
  78. package/dist/src/ui/components/DebugProfiler.js.map +1 -1
  79. package/dist/src/ui/components/DebugProfiler.test.js +28 -0
  80. package/dist/src/ui/components/DebugProfiler.test.js.map +1 -1
  81. package/dist/src/ui/components/DialogManager.js +4 -0
  82. package/dist/src/ui/components/DialogManager.js.map +1 -1
  83. package/dist/src/ui/components/InputPrompt.js +13 -4
  84. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  85. package/dist/src/ui/components/InputPrompt.test.js +21 -2
  86. package/dist/src/ui/components/InputPrompt.test.js.map +1 -1
  87. package/dist/src/ui/components/StatusDisplay.js +9 -3
  88. package/dist/src/ui/components/StatusDisplay.js.map +1 -1
  89. package/dist/src/ui/components/StatusDisplay.test.js +14 -3
  90. package/dist/src/ui/components/StatusDisplay.test.js.map +1 -1
  91. package/dist/src/ui/components/ValidationDialog.d.ts +15 -0
  92. package/dist/src/ui/components/ValidationDialog.js +86 -0
  93. package/dist/src/ui/components/ValidationDialog.js.map +1 -0
  94. package/dist/src/ui/components/ValidationDialog.test.js +128 -0
  95. package/dist/src/ui/components/ValidationDialog.test.js.map +1 -0
  96. package/dist/src/ui/components/messages/CompressionMessage.js +2 -0
  97. package/dist/src/ui/components/messages/CompressionMessage.js.map +1 -1
  98. package/dist/src/ui/components/messages/CompressionMessage.test.js +23 -0
  99. package/dist/src/ui/components/messages/CompressionMessage.test.js.map +1 -1
  100. package/dist/src/ui/components/messages/RedirectionConfirmation.test.d.ts +6 -0
  101. package/dist/src/ui/components/messages/RedirectionConfirmation.test.js +35 -0
  102. package/dist/src/ui/components/messages/RedirectionConfirmation.test.js.map +1 -0
  103. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +26 -4
  104. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  105. package/dist/src/ui/components/shared/ScrollableList.test.js +4 -4
  106. package/dist/src/ui/components/shared/ScrollableList.test.js.map +1 -1
  107. package/dist/src/ui/components/shared/text-buffer.js +4 -4
  108. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  109. package/dist/src/ui/components/shared/text-buffer.test.js +12 -0
  110. package/dist/src/ui/components/shared/text-buffer.test.js.map +1 -1
  111. package/dist/src/ui/contexts/KeypressContext.js +3 -3
  112. package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
  113. package/dist/src/ui/contexts/KeypressContext.test.js +20 -0
  114. package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
  115. package/dist/src/ui/contexts/UIActionsContext.d.ts +1 -0
  116. package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
  117. package/dist/src/ui/contexts/UIStateContext.d.ts +8 -1
  118. package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
  119. package/dist/src/ui/hooks/toolMapping.d.ts +14 -0
  120. package/dist/src/ui/hooks/toolMapping.js +103 -0
  121. package/dist/src/ui/hooks/toolMapping.js.map +1 -0
  122. package/dist/src/ui/hooks/toolMapping.test.d.ts +6 -0
  123. package/dist/src/ui/hooks/toolMapping.test.js +188 -0
  124. package/dist/src/ui/hooks/toolMapping.test.js.map +1 -0
  125. package/dist/src/ui/hooks/useGeminiStream.js +16 -2
  126. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  127. package/dist/src/ui/hooks/useGeminiStream.test.js +62 -0
  128. package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -1
  129. package/dist/src/ui/hooks/useQuotaAndFallback.d.ts +4 -2
  130. package/dist/src/ui/hooks/useQuotaAndFallback.js +39 -4
  131. package/dist/src/ui/hooks/useQuotaAndFallback.js.map +1 -1
  132. package/dist/src/ui/hooks/useQuotaAndFallback.test.js +123 -8
  133. package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +1 -1
  134. package/dist/src/ui/hooks/useReactToolScheduler.d.ts +8 -7
  135. package/dist/src/ui/hooks/useReactToolScheduler.js +7 -122
  136. package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -1
  137. package/dist/src/ui/hooks/useToolScheduler.test.js +2 -1
  138. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
  139. package/dist/src/ui/keyMatchers.test.js +6 -4
  140. package/dist/src/ui/keyMatchers.test.js.map +1 -1
  141. package/dist/src/ui/textConstants.d.ts +4 -0
  142. package/dist/src/ui/textConstants.js +4 -0
  143. package/dist/src/ui/textConstants.js.map +1 -1
  144. package/dist/src/utils/agentSettings.d.ts +3 -3
  145. package/dist/src/utils/agentSettings.js +11 -12
  146. package/dist/src/utils/agentSettings.js.map +1 -1
  147. package/dist/tsconfig.tsbuildinfo +1 -1
  148. package/package.json +3 -3
  149. package/dist/google-gemini-cli-0.26.0-nightly.20260115.6cb3ae4e0.tgz +0 -0
  150. package/dist/src/commands/extensions/examples/mcp-server/example.js.map +0 -1
  151. package/dist/src/commands/extensions/examples/mcp-server/example.test.js +0 -111
  152. package/dist/src/commands/extensions/examples/mcp-server/example.test.js.map +0 -1
  153. package/dist/src/commands/extensions/examples/mcp-server/example.test.ts +0 -135
  154. package/dist/src/commands/extensions/examples/mcp-server/example.ts +0 -60
  155. package/dist/src/commands/extensions/examples/mcp-server/tsconfig.json +0 -13
  156. /package/dist/src/{commands/extensions/examples/mcp-server/example.d.ts → deferred.test.d.ts} +0 -0
  157. /package/dist/src/{commands/extensions/examples/mcp-server/example.test.d.ts → ui/components/ValidationDialog.test.d.ts} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@google/gemini-cli",
3
- "version": "0.26.0-nightly.20260120.a90bcf749",
3
+ "version": "0.26.0-preview.0",
4
4
  "description": "Gemini CLI",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -26,11 +26,11 @@
26
26
  "dist"
27
27
  ],
28
28
  "config": {
29
- "sandboxImageUri": "us-docker.pkg.dev/gemini-code-dev/gemini-cli/sandbox:0.26.0-nightly.20260120.a90bcf749"
29
+ "sandboxImageUri": "us-docker.pkg.dev/gemini-code-dev/gemini-cli/sandbox:0.26.0-preview.0"
30
30
  },
31
31
  "dependencies": {
32
32
  "@agentclientprotocol/sdk": "^0.12.0",
33
- "@google/gemini-cli-core": "0.26.0-nightly.20260120.a90bcf749",
33
+ "@google/gemini-cli-core": "0.26.0-preview.0",
34
34
  "@google/genai": "1.30.0",
35
35
  "@iarna/toml": "^2.2.5",
36
36
  "@modelcontextprotocol/sdk": "^1.23.0",
@@ -1 +0,0 @@
1
- {"version":3,"file":"example.js","sourceRoot":"","sources":["../../../../../../src/commands/extensions/examples/mcp-server/example.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,eAAe;IACrB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;IACE,WAAW,EAAE,4CAA4C;IACzD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK;CAChC,EACD,KAAK,IAAI,EAAE;IACT,MAAM,WAAW,GAAG,MAAM,KAAK,CAC7B,4CAA4C,CAC7C,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAC9C,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;aAC/B;SACF;KACF,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,cAAc,CACnB,aAAa,EACb;IACE,KAAK,EAAE,aAAa;IACpB,WAAW,EAAE,oBAAoB;IACjC,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE;CAC/D,EACD,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACpB,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE;gBACP,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,gBAAgB,IAAI,CAAC,CAAC,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,KAAK,qFAAqF;aAChK;SACF;KACF;CACF,CAAC,CACH,CAAC;AAEF,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
@@ -1,111 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
8
- import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
9
- import { z } from 'zod';
10
- // Mock the MCP server and transport
11
- const mockRegisterTool = vi.fn();
12
- const mockRegisterPrompt = vi.fn();
13
- const mockConnect = vi.fn();
14
- vi.mock('@modelcontextprotocol/sdk/server/mcp.js', () => ({
15
- McpServer: vi.fn().mockImplementation(() => ({
16
- registerTool: mockRegisterTool,
17
- registerPrompt: mockRegisterPrompt,
18
- connect: mockConnect,
19
- })),
20
- }));
21
- vi.mock('@modelcontextprotocol/sdk/server/stdio.js', () => ({
22
- StdioServerTransport: vi.fn(),
23
- }));
24
- describe('MCP Server Example', () => {
25
- beforeEach(async () => {
26
- // Dynamically import the server setup after mocks are in place
27
- await import('./example.js');
28
- });
29
- afterEach(() => {
30
- vi.clearAllMocks();
31
- vi.resetModules();
32
- });
33
- it('should create an McpServer with the correct name and version', () => {
34
- expect(McpServer).toHaveBeenCalledWith({
35
- name: 'prompt-server',
36
- version: '1.0.0',
37
- });
38
- });
39
- it('should register the "fetch_posts" tool', () => {
40
- expect(mockRegisterTool).toHaveBeenCalledWith('fetch_posts', {
41
- description: 'Fetches a list of posts from a public API.',
42
- inputSchema: z.object({}).shape,
43
- }, expect.any(Function));
44
- });
45
- it('should register the "poem-writer" prompt', () => {
46
- expect(mockRegisterPrompt).toHaveBeenCalledWith('poem-writer', {
47
- title: 'Poem Writer',
48
- description: 'Write a nice haiku',
49
- argsSchema: expect.any(Object),
50
- }, expect.any(Function));
51
- });
52
- it('should connect the server to an StdioServerTransport', () => {
53
- expect(StdioServerTransport).toHaveBeenCalled();
54
- expect(mockConnect).toHaveBeenCalledWith(expect.any(StdioServerTransport));
55
- });
56
- describe('fetch_posts tool implementation', () => {
57
- it('should fetch posts and return a formatted response', async () => {
58
- const mockPosts = [
59
- { id: 1, title: 'Post 1' },
60
- { id: 2, title: 'Post 2' },
61
- ];
62
- global.fetch = vi.fn().mockResolvedValue({
63
- json: vi.fn().mockResolvedValue(mockPosts),
64
- });
65
- const toolFn = mockRegisterTool.mock.calls[0][2];
66
- const result = await toolFn();
67
- expect(global.fetch).toHaveBeenCalledWith('https://jsonplaceholder.typicode.com/posts');
68
- expect(result).toEqual({
69
- content: [
70
- {
71
- type: 'text',
72
- text: JSON.stringify({ posts: mockPosts }),
73
- },
74
- ],
75
- });
76
- });
77
- });
78
- describe('poem-writer prompt implementation', () => {
79
- it('should generate a prompt with a title', () => {
80
- const promptFn = mockRegisterPrompt.mock.calls[0][2];
81
- const result = promptFn({ title: 'My Poem' });
82
- expect(result).toEqual({
83
- messages: [
84
- {
85
- role: 'user',
86
- content: {
87
- type: 'text',
88
- text: 'Write a haiku called My Poem. Note that a haiku is 5 syllables followed by 7 syllables followed by 5 syllables ',
89
- },
90
- },
91
- ],
92
- });
93
- });
94
- it('should generate a prompt with a title and mood', () => {
95
- const promptFn = mockRegisterPrompt.mock.calls[0][2];
96
- const result = promptFn({ title: 'My Poem', mood: 'sad' });
97
- expect(result).toEqual({
98
- messages: [
99
- {
100
- role: 'user',
101
- content: {
102
- type: 'text',
103
- text: 'Write a haiku with the mood sad called My Poem. Note that a haiku is 5 syllables followed by 7 syllables followed by 5 syllables ',
104
- },
105
- },
106
- ],
107
- });
108
- });
109
- });
110
- });
111
- //# sourceMappingURL=example.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"example.test.js","sourceRoot":"","sources":["../../../../../../src/commands/extensions/examples/mcp-server/example.test.ts"],"names":[],"mappings":"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"}
@@ -1,135 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
-
7
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
8
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
9
- import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
10
- import { z } from 'zod';
11
-
12
- // Mock the MCP server and transport
13
- const mockRegisterTool = vi.fn();
14
- const mockRegisterPrompt = vi.fn();
15
- const mockConnect = vi.fn();
16
-
17
- vi.mock('@modelcontextprotocol/sdk/server/mcp.js', () => ({
18
- McpServer: vi.fn().mockImplementation(() => ({
19
- registerTool: mockRegisterTool,
20
- registerPrompt: mockRegisterPrompt,
21
- connect: mockConnect,
22
- })),
23
- }));
24
-
25
- vi.mock('@modelcontextprotocol/sdk/server/stdio.js', () => ({
26
- StdioServerTransport: vi.fn(),
27
- }));
28
-
29
- describe('MCP Server Example', () => {
30
- beforeEach(async () => {
31
- // Dynamically import the server setup after mocks are in place
32
- await import('./example.js');
33
- });
34
-
35
- afterEach(() => {
36
- vi.clearAllMocks();
37
- vi.resetModules();
38
- });
39
-
40
- it('should create an McpServer with the correct name and version', () => {
41
- expect(McpServer).toHaveBeenCalledWith({
42
- name: 'prompt-server',
43
- version: '1.0.0',
44
- });
45
- });
46
-
47
- it('should register the "fetch_posts" tool', () => {
48
- expect(mockRegisterTool).toHaveBeenCalledWith(
49
- 'fetch_posts',
50
- {
51
- description: 'Fetches a list of posts from a public API.',
52
- inputSchema: z.object({}).shape,
53
- },
54
- expect.any(Function),
55
- );
56
- });
57
-
58
- it('should register the "poem-writer" prompt', () => {
59
- expect(mockRegisterPrompt).toHaveBeenCalledWith(
60
- 'poem-writer',
61
- {
62
- title: 'Poem Writer',
63
- description: 'Write a nice haiku',
64
- argsSchema: expect.any(Object),
65
- },
66
- expect.any(Function),
67
- );
68
- });
69
-
70
- it('should connect the server to an StdioServerTransport', () => {
71
- expect(StdioServerTransport).toHaveBeenCalled();
72
- expect(mockConnect).toHaveBeenCalledWith(expect.any(StdioServerTransport));
73
- });
74
-
75
- describe('fetch_posts tool implementation', () => {
76
- it('should fetch posts and return a formatted response', async () => {
77
- const mockPosts = [
78
- { id: 1, title: 'Post 1' },
79
- { id: 2, title: 'Post 2' },
80
- ];
81
- global.fetch = vi.fn().mockResolvedValue({
82
- json: vi.fn().mockResolvedValue(mockPosts),
83
- });
84
-
85
- const toolFn = mockRegisterTool.mock.calls[0][2];
86
- const result = await toolFn();
87
-
88
- expect(global.fetch).toHaveBeenCalledWith(
89
- 'https://jsonplaceholder.typicode.com/posts',
90
- );
91
- expect(result).toEqual({
92
- content: [
93
- {
94
- type: 'text',
95
- text: JSON.stringify({ posts: mockPosts }),
96
- },
97
- ],
98
- });
99
- });
100
- });
101
-
102
- describe('poem-writer prompt implementation', () => {
103
- it('should generate a prompt with a title', () => {
104
- const promptFn = mockRegisterPrompt.mock.calls[0][2];
105
- const result = promptFn({ title: 'My Poem' });
106
- expect(result).toEqual({
107
- messages: [
108
- {
109
- role: 'user',
110
- content: {
111
- type: 'text',
112
- text: 'Write a haiku called My Poem. Note that a haiku is 5 syllables followed by 7 syllables followed by 5 syllables ',
113
- },
114
- },
115
- ],
116
- });
117
- });
118
-
119
- it('should generate a prompt with a title and mood', () => {
120
- const promptFn = mockRegisterPrompt.mock.calls[0][2];
121
- const result = promptFn({ title: 'My Poem', mood: 'sad' });
122
- expect(result).toEqual({
123
- messages: [
124
- {
125
- role: 'user',
126
- content: {
127
- type: 'text',
128
- text: 'Write a haiku with the mood sad called My Poem. Note that a haiku is 5 syllables followed by 7 syllables followed by 5 syllables ',
129
- },
130
- },
131
- ],
132
- });
133
- });
134
- });
135
- });
@@ -1,60 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
-
7
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
8
- import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
9
- import { z } from 'zod';
10
-
11
- const server = new McpServer({
12
- name: 'prompt-server',
13
- version: '1.0.0',
14
- });
15
-
16
- server.registerTool(
17
- 'fetch_posts',
18
- {
19
- description: 'Fetches a list of posts from a public API.',
20
- inputSchema: z.object({}).shape,
21
- },
22
- async () => {
23
- const apiResponse = await fetch(
24
- 'https://jsonplaceholder.typicode.com/posts',
25
- );
26
- const posts = await apiResponse.json();
27
- const response = { posts: posts.slice(0, 5) };
28
- return {
29
- content: [
30
- {
31
- type: 'text',
32
- text: JSON.stringify(response),
33
- },
34
- ],
35
- };
36
- },
37
- );
38
-
39
- server.registerPrompt(
40
- 'poem-writer',
41
- {
42
- title: 'Poem Writer',
43
- description: 'Write a nice haiku',
44
- argsSchema: { title: z.string(), mood: z.string().optional() },
45
- },
46
- ({ title, mood }) => ({
47
- messages: [
48
- {
49
- role: 'user',
50
- content: {
51
- type: 'text',
52
- text: `Write a haiku${mood ? ` with the mood ${mood}` : ''} called ${title}. Note that a haiku is 5 syllables followed by 7 syllables followed by 5 syllables `,
53
- },
54
- },
55
- ],
56
- }),
57
- );
58
-
59
- const transport = new StdioServerTransport();
60
- await server.connect(transport);
@@ -1,13 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "module": "NodeNext",
5
- "moduleResolution": "NodeNext",
6
- "strict": true,
7
- "esModuleInterop": true,
8
- "skipLibCheck": true,
9
- "forceConsistentCasingInFileNames": true,
10
- "outDir": "./dist"
11
- },
12
- "include": ["example.ts"]
13
- }