@semiont/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +497 -0
- package/dist/cli.mjs +45524 -0
- package/dist/dashboard/dashboard.css +238 -0
- package/dist/dashboard/dashboard.js +14 -0
- package/dist/dashboard/dashboard.js.map +7 -0
- package/dist/mcp-server/handlers-stubs.d.ts +40 -0
- package/dist/mcp-server/handlers-stubs.d.ts.map +1 -0
- package/dist/mcp-server/handlers-stubs.js +22 -0
- package/dist/mcp-server/handlers-stubs.js.map +1 -0
- package/dist/mcp-server/handlers.d.ts +96 -0
- package/dist/mcp-server/handlers.d.ts.map +1 -0
- package/dist/mcp-server/handlers.js +253 -0
- package/dist/mcp-server/handlers.js.map +1 -0
- package/dist/mcp-server/index.d.ts +3 -0
- package/dist/mcp-server/index.d.ts.map +1 -0
- package/dist/mcp-server/index.js +365 -0
- package/dist/mcp-server/index.js.map +1 -0
- package/dist/mcp-server/index.test.d.ts +7 -0
- package/dist/mcp-server/index.test.d.ts.map +1 -0
- package/dist/mcp-server/index.test.js +183 -0
- package/dist/mcp-server/index.test.js.map +1 -0
- package/dist/templates/cdk/app-stack.ts +893 -0
- package/dist/templates/cdk/app.ts +54 -0
- package/dist/templates/cdk/data-stack.ts +416 -0
- package/dist/templates/cdk.json +36 -0
- package/dist/templates/environments/ci.json +52 -0
- package/dist/templates/environments/local.json +82 -0
- package/dist/templates/environments/production.json +57 -0
- package/dist/templates/environments/staging.json +49 -0
- package/dist/templates/environments/test.json +61 -0
- package/dist/templates/inference-claude.json +14 -0
- package/dist/templates/inference-openai.json +16 -0
- package/dist/templates/package.json +23 -0
- package/dist/templates/semiont.json +31 -0
- package/dist/templates/tsconfig.json +27 -0
- package/package.json +91 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests for the Semiont MCP (Model Context Protocol) server
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
7
|
+
// Mock environment variables
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
process.env.SEMIONT_API_URL = 'http://test.api.semiont.com';
|
|
10
|
+
process.env.SEMIONT_API_TOKEN = 'test-token-123';
|
|
11
|
+
});
|
|
12
|
+
afterEach(() => {
|
|
13
|
+
delete process.env.SEMIONT_API_URL;
|
|
14
|
+
delete process.env.SEMIONT_API_TOKEN;
|
|
15
|
+
vi.clearAllMocks();
|
|
16
|
+
});
|
|
17
|
+
// Mock fetch globally
|
|
18
|
+
global.fetch = vi.fn();
|
|
19
|
+
describe('MCP Server', () => {
|
|
20
|
+
describe('Tool Registration', () => {
|
|
21
|
+
it('should register semiont_hello tool', async () => {
|
|
22
|
+
// Import the server module to trigger registration
|
|
23
|
+
await import('./index.js');
|
|
24
|
+
// The server should have registered the semiont_hello tool
|
|
25
|
+
// We can't directly test the Server instance, but we can verify
|
|
26
|
+
// the module loads without errors
|
|
27
|
+
expect(process.env.SEMIONT_API_URL).toBe('http://test.api.semiont.com');
|
|
28
|
+
expect(process.env.SEMIONT_API_TOKEN).toBe('test-token-123');
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
describe('Tool Execution', () => {
|
|
32
|
+
beforeEach(() => {
|
|
33
|
+
// Reset fetch mock
|
|
34
|
+
global.fetch.mockReset();
|
|
35
|
+
});
|
|
36
|
+
it('should call API with authentication for hello tool', async () => {
|
|
37
|
+
// Mock successful API response
|
|
38
|
+
global.fetch.mockResolvedValue({
|
|
39
|
+
ok: true,
|
|
40
|
+
json: async () => ({
|
|
41
|
+
message: 'Hello, World!',
|
|
42
|
+
platform: 'test',
|
|
43
|
+
timestamp: new Date().toISOString(),
|
|
44
|
+
user: 'test@example.com'
|
|
45
|
+
})
|
|
46
|
+
});
|
|
47
|
+
// Since we can't directly test the server handlers without
|
|
48
|
+
// the full MCP infrastructure, we test the API interaction pattern
|
|
49
|
+
const url = `${process.env.SEMIONT_API_URL}/api/hello`;
|
|
50
|
+
const response = await fetch(url, {
|
|
51
|
+
method: 'GET',
|
|
52
|
+
headers: {
|
|
53
|
+
'Authorization': `Bearer ${process.env.SEMIONT_API_TOKEN}`,
|
|
54
|
+
'Content-Type': 'application/json',
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
expect(global.fetch).toHaveBeenCalledWith('http://test.api.semiont.com/api/hello', expect.objectContaining({
|
|
58
|
+
method: 'GET',
|
|
59
|
+
headers: expect.objectContaining({
|
|
60
|
+
'Authorization': 'Bearer test-token-123',
|
|
61
|
+
'Content-Type': 'application/json',
|
|
62
|
+
})
|
|
63
|
+
}));
|
|
64
|
+
const data = await response.json();
|
|
65
|
+
expect(data).toMatchObject({
|
|
66
|
+
message: 'Hello, World!',
|
|
67
|
+
platform: 'test',
|
|
68
|
+
user: 'test@example.com'
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
it('should handle API authentication failure', async () => {
|
|
72
|
+
// Mock 401 response
|
|
73
|
+
global.fetch.mockResolvedValue({
|
|
74
|
+
ok: false,
|
|
75
|
+
status: 401,
|
|
76
|
+
statusText: 'Unauthorized'
|
|
77
|
+
});
|
|
78
|
+
const url = `${process.env.SEMIONT_API_URL}/api/hello`;
|
|
79
|
+
const response = await fetch(url, {
|
|
80
|
+
method: 'GET',
|
|
81
|
+
headers: {
|
|
82
|
+
'Authorization': `Bearer ${process.env.SEMIONT_API_TOKEN}`,
|
|
83
|
+
'Content-Type': 'application/json',
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
expect(response.ok).toBe(false);
|
|
87
|
+
expect(response.status).toBe(401);
|
|
88
|
+
});
|
|
89
|
+
it('should call API with name parameter when provided', async () => {
|
|
90
|
+
const testName = 'TestUser';
|
|
91
|
+
// Mock successful API response
|
|
92
|
+
global.fetch.mockResolvedValue({
|
|
93
|
+
ok: true,
|
|
94
|
+
json: async () => ({
|
|
95
|
+
message: `Hello, ${testName}!`,
|
|
96
|
+
platform: 'test',
|
|
97
|
+
timestamp: new Date().toISOString(),
|
|
98
|
+
user: 'test@example.com'
|
|
99
|
+
})
|
|
100
|
+
});
|
|
101
|
+
const url = `${process.env.SEMIONT_API_URL}/api/hello/${encodeURIComponent(testName)}`;
|
|
102
|
+
const response = await fetch(url, {
|
|
103
|
+
method: 'GET',
|
|
104
|
+
headers: {
|
|
105
|
+
'Authorization': `Bearer ${process.env.SEMIONT_API_TOKEN}`,
|
|
106
|
+
'Content-Type': 'application/json',
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
expect(global.fetch).toHaveBeenCalledWith(`http://test.api.semiont.com/api/hello/${testName}`, expect.anything());
|
|
110
|
+
const data = await response.json();
|
|
111
|
+
expect(data.message).toContain(testName);
|
|
112
|
+
});
|
|
113
|
+
it('should handle network errors gracefully', async () => {
|
|
114
|
+
// Mock network error
|
|
115
|
+
global.fetch.mockRejectedValue(new Error('Network error'));
|
|
116
|
+
const url = `${process.env.SEMIONT_API_URL}/api/hello`;
|
|
117
|
+
await expect(fetch(url, {
|
|
118
|
+
method: 'GET',
|
|
119
|
+
headers: {
|
|
120
|
+
'Authorization': `Bearer ${process.env.SEMIONT_API_TOKEN}`,
|
|
121
|
+
'Content-Type': 'application/json',
|
|
122
|
+
},
|
|
123
|
+
})).rejects.toThrow('Network error');
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
describe('Environment Configuration', () => {
|
|
127
|
+
it('should use default API URL when not specified', async () => {
|
|
128
|
+
delete process.env.SEMIONT_API_URL;
|
|
129
|
+
// Re-import to get default values
|
|
130
|
+
const module = await import('./index.js');
|
|
131
|
+
// The module should use the default URL
|
|
132
|
+
// Since we can't access the const directly, we verify it doesn't crash
|
|
133
|
+
expect(module).toBeDefined();
|
|
134
|
+
});
|
|
135
|
+
it('should handle missing API token', async () => {
|
|
136
|
+
delete process.env.SEMIONT_API_TOKEN;
|
|
137
|
+
// Mock API call without token
|
|
138
|
+
global.fetch.mockResolvedValue({
|
|
139
|
+
ok: false,
|
|
140
|
+
status: 401,
|
|
141
|
+
statusText: 'Unauthorized'
|
|
142
|
+
});
|
|
143
|
+
const url = 'http://localhost:4000/api/hello';
|
|
144
|
+
const response = await fetch(url, {
|
|
145
|
+
method: 'GET',
|
|
146
|
+
headers: {
|
|
147
|
+
'Authorization': 'Bearer ',
|
|
148
|
+
'Content-Type': 'application/json',
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
expect(response.status).toBe(401);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
describe('Input Validation', () => {
|
|
155
|
+
it('should handle name parameter with special characters', () => {
|
|
156
|
+
const specialName = 'Test User & Co. <script>';
|
|
157
|
+
const encoded = encodeURIComponent(specialName);
|
|
158
|
+
expect(encoded).toBe('Test%20User%20%26%20Co.%20%3Cscript%3E');
|
|
159
|
+
// Verify the URL is properly constructed
|
|
160
|
+
const url = `http://test.api.semiont.com/api/hello/${encoded}`;
|
|
161
|
+
expect(url).toContain('Test%20User%20%26%20Co.%20%3Cscript%3E');
|
|
162
|
+
});
|
|
163
|
+
it('should handle very long name parameters', () => {
|
|
164
|
+
const longName = 'A'.repeat(150); // Exceeds typical 100 char limit
|
|
165
|
+
const encoded = encodeURIComponent(longName);
|
|
166
|
+
// The encoding should work regardless of length
|
|
167
|
+
expect(encoded).toBe(longName);
|
|
168
|
+
// Server should handle length validation
|
|
169
|
+
const url = `http://test.api.semiont.com/api/hello/${encoded}`;
|
|
170
|
+
expect(url.length).toBeGreaterThan(150);
|
|
171
|
+
});
|
|
172
|
+
it('should handle empty name parameter', () => {
|
|
173
|
+
const emptyName = '';
|
|
174
|
+
const encoded = encodeURIComponent(emptyName);
|
|
175
|
+
expect(encoded).toBe('');
|
|
176
|
+
// Should use the base URL without name
|
|
177
|
+
const baseUrl = 'http://test.api.semiont.com/api/hello';
|
|
178
|
+
const url = emptyName ? `${baseUrl}/${encoded}` : baseUrl;
|
|
179
|
+
expect(url).toBe(baseUrl);
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
//# sourceMappingURL=index.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}
|