@dpesch/mantisbt-mcp-server 1.10.3 → 1.11.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 (54) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.de.md +11 -8
  3. package/README.md +11 -8
  4. package/dist/config.js +13 -0
  5. package/dist/index.js +12 -12
  6. package/dist/tools/files.js +11 -2
  7. package/dist/tools/issues.js +47 -15
  8. package/dist/tools/notes.js +15 -10
  9. package/docs/cookbook.de.md +67 -0
  10. package/docs/cookbook.md +67 -0
  11. package/docs/examples.de.md +8 -0
  12. package/docs/examples.md +8 -0
  13. package/package.json +1 -1
  14. package/server.json +2 -2
  15. package/.gitea/PULL_REQUEST_TEMPLATE.md +0 -17
  16. package/.gitea/workflows/ci.yml +0 -95
  17. package/.github/workflows/ci.yml +0 -32
  18. package/scripts/hooks/pre-push.mjs +0 -220
  19. package/scripts/init.mjs +0 -95
  20. package/scripts/record-fixtures.ts +0 -160
  21. package/tests/cache.test.ts +0 -265
  22. package/tests/client.test.ts +0 -372
  23. package/tests/config.test.ts +0 -263
  24. package/tests/fixtures/get_current_user.json +0 -40
  25. package/tests/fixtures/get_issue.json +0 -133
  26. package/tests/fixtures/get_issue_enums.json +0 -67
  27. package/tests/fixtures/get_issue_fields_sample.json +0 -76
  28. package/tests/fixtures/get_project_categories.json +0 -157
  29. package/tests/fixtures/get_project_versions.json +0 -3
  30. package/tests/fixtures/get_project_versions_with_data.json +0 -52
  31. package/tests/fixtures/list_issues.json +0 -95
  32. package/tests/fixtures/list_projects.json +0 -65
  33. package/tests/helpers/mock-server.ts +0 -166
  34. package/tests/helpers/search-mocks.ts +0 -84
  35. package/tests/prompts/prompts.test.ts +0 -242
  36. package/tests/resources/resources.test.ts +0 -309
  37. package/tests/search/embedder.test.ts +0 -81
  38. package/tests/search/highlight.test.ts +0 -129
  39. package/tests/search/store.test.ts +0 -193
  40. package/tests/search/sync.test.ts +0 -249
  41. package/tests/search/tools.test.ts +0 -661
  42. package/tests/tools/config.test.ts +0 -212
  43. package/tests/tools/files.test.ts +0 -343
  44. package/tests/tools/issues.test.ts +0 -1180
  45. package/tests/tools/metadata.test.ts +0 -509
  46. package/tests/tools/monitors.test.ts +0 -101
  47. package/tests/tools/projects.test.ts +0 -338
  48. package/tests/tools/relationships.test.ts +0 -177
  49. package/tests/tools/string-coercion.test.ts +0 -317
  50. package/tests/tools/users.test.ts +0 -62
  51. package/tests/utils/date-filter.test.ts +0 -169
  52. package/tests/version-hint.test.ts +0 -230
  53. package/tsconfig.build.json +0 -8
  54. package/vitest.config.ts +0 -8
@@ -1,230 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from 'vitest';
2
- import { parseVersion, compareVersions, VersionHintService } from '../src/version-hint.js';
3
-
4
- // ---------------------------------------------------------------------------
5
- // parseVersion
6
- // ---------------------------------------------------------------------------
7
-
8
- describe('parseVersion()', () => {
9
- it('parses a standard version string', () => {
10
- expect(parseVersion('2.25.7')).toEqual([2, 25, 7]);
11
- });
12
-
13
- it('strips leading v prefix', () => {
14
- expect(parseVersion('v1.2.3')).toEqual([1, 2, 3]);
15
- });
16
-
17
- it('returns null for invalid strings', () => {
18
- expect(parseVersion('not-a-version')).toBeNull();
19
- expect(parseVersion('')).toBeNull();
20
- expect(parseVersion('1.2')).toBeNull();
21
- });
22
-
23
- it('ignores extra suffix after patch number', () => {
24
- expect(parseVersion('2.25.7-beta')).toEqual([2, 25, 7]);
25
- });
26
- });
27
-
28
- // ---------------------------------------------------------------------------
29
- // compareVersions
30
- // ---------------------------------------------------------------------------
31
-
32
- describe('compareVersions()', () => {
33
- it('returns 0 for equal versions', () => {
34
- expect(compareVersions([2, 25, 7], [2, 25, 7])).toBe(0);
35
- });
36
-
37
- it('returns -1 when first version is older (major)', () => {
38
- expect(compareVersions([1, 0, 0], [2, 0, 0])).toBe(-1);
39
- });
40
-
41
- it('returns 1 when first version is newer (major)', () => {
42
- expect(compareVersions([3, 0, 0], [2, 99, 99])).toBe(1);
43
- });
44
-
45
- it('compares minor version correctly', () => {
46
- expect(compareVersions([2, 24, 0], [2, 25, 0])).toBe(-1);
47
- expect(compareVersions([2, 26, 0], [2, 25, 0])).toBe(1);
48
- });
49
-
50
- it('compares patch version correctly', () => {
51
- expect(compareVersions([2, 25, 6], [2, 25, 7])).toBe(-1);
52
- expect(compareVersions([2, 25, 8], [2, 25, 7])).toBe(1);
53
- });
54
- });
55
-
56
- // ---------------------------------------------------------------------------
57
- // VersionHintService – getUpdateHint()
58
- // ---------------------------------------------------------------------------
59
-
60
- describe('VersionHintService – getUpdateHint()', () => {
61
- it('returns null when installedVersion is not set', () => {
62
- const svc = new VersionHintService();
63
- expect(svc.getUpdateHint()).toBeNull();
64
- });
65
-
66
- it('returns null when latestVersion is not set', () => {
67
- const svc = new VersionHintService();
68
- // Simulate installed version via onSuccessfulResponse
69
- const mockResponse = {
70
- headers: { get: (key: string) => key === 'X-Mantis-Version' ? '2.25.6' : null },
71
- } as unknown as Response;
72
- svc.onSuccessfulResponse(mockResponse);
73
- expect(svc.getUpdateHint()).toBeNull();
74
- });
75
-
76
- it('returns hint string when latestVersion > installedVersion', async () => {
77
- const fetchMock = vi.fn().mockResolvedValue({
78
- ok: true,
79
- json: () => Promise.resolve([{ name: 'release-2.25.7' }]),
80
- });
81
- vi.stubGlobal('fetch', fetchMock);
82
-
83
- const svc = new VersionHintService();
84
-
85
- const mockResponse = {
86
- headers: { get: (key: string) => key === 'X-Mantis-Version' ? '2.25.6' : null },
87
- } as unknown as Response;
88
- svc.onSuccessfulResponse(mockResponse);
89
-
90
- // Trigger fetch and wait for it to complete
91
- svc.triggerLatestVersionFetch();
92
- await svc.waitForLatestVersion(1000);
93
-
94
- const hint = svc.getUpdateHint();
95
- expect(hint).not.toBeNull();
96
- expect(hint).toContain('2.25.7');
97
- expect(hint).toContain('2.25.6');
98
- });
99
-
100
- it('returns null when installed version equals latest version', async () => {
101
- const fetchMock = vi.fn().mockResolvedValue({
102
- ok: true,
103
- json: () => Promise.resolve([{ name: 'release-2.25.7' }]),
104
- });
105
- vi.stubGlobal('fetch', fetchMock);
106
-
107
- const svc = new VersionHintService();
108
-
109
- const mockResponse = {
110
- headers: { get: (key: string) => key === 'X-Mantis-Version' ? '2.25.7' : null },
111
- } as unknown as Response;
112
- svc.onSuccessfulResponse(mockResponse);
113
-
114
- svc.triggerLatestVersionFetch();
115
- await svc.waitForLatestVersion(1000);
116
-
117
- expect(svc.getUpdateHint()).toBeNull();
118
- });
119
-
120
- it('returns null when installedVersion is newer than latestVersion', async () => {
121
- const fetchMock = vi.fn().mockResolvedValue({
122
- ok: true,
123
- json: () => Promise.resolve([{ name: 'release-2.25.6' }]),
124
- });
125
- vi.stubGlobal('fetch', fetchMock);
126
-
127
- const svc = new VersionHintService();
128
-
129
- const mockResponse = {
130
- headers: { get: (key: string) => key === 'X-Mantis-Version' ? '2.25.7' : null },
131
- } as unknown as Response;
132
- svc.onSuccessfulResponse(mockResponse);
133
-
134
- svc.triggerLatestVersionFetch();
135
- await svc.waitForLatestVersion(1000);
136
-
137
- expect(svc.getUpdateHint()).toBeNull();
138
- });
139
- });
140
-
141
- // ---------------------------------------------------------------------------
142
- // VersionHintService – onSuccessfulResponse()
143
- // ---------------------------------------------------------------------------
144
-
145
- describe('VersionHintService – onSuccessfulResponse()', () => {
146
- it('extracts X-Mantis-Version header from response', () => {
147
- const svc = new VersionHintService();
148
- const mockResponse = {
149
- headers: { get: (key: string) => key === 'X-Mantis-Version' ? '2.25.7' : null },
150
- } as unknown as Response;
151
-
152
- svc.onSuccessfulResponse(mockResponse);
153
- expect(svc.getInstalledVersion()).toBe('2.25.7');
154
- });
155
-
156
- it('does not overwrite already set installedVersion', () => {
157
- const svc = new VersionHintService();
158
-
159
- const first = {
160
- headers: { get: (key: string) => key === 'X-Mantis-Version' ? '2.25.6' : null },
161
- } as unknown as Response;
162
- const second = {
163
- headers: { get: (key: string) => key === 'X-Mantis-Version' ? '2.25.7' : null },
164
- } as unknown as Response;
165
-
166
- svc.onSuccessfulResponse(first);
167
- svc.onSuccessfulResponse(second);
168
-
169
- expect(svc.getInstalledVersion()).toBe('2.25.6');
170
- });
171
-
172
- it('ignores response without X-Mantis-Version header', () => {
173
- const svc = new VersionHintService();
174
- const mockResponse = {
175
- headers: { get: (_key: string) => null },
176
- } as unknown as Response;
177
-
178
- svc.onSuccessfulResponse(mockResponse);
179
- expect(svc.getInstalledVersion()).toBeNull();
180
- });
181
- });
182
-
183
- // ---------------------------------------------------------------------------
184
- // VersionHintService – triggerLatestVersionFetch()
185
- // ---------------------------------------------------------------------------
186
-
187
- describe('VersionHintService – triggerLatestVersionFetch()', () => {
188
- beforeEach(() => {
189
- vi.unstubAllGlobals();
190
- });
191
-
192
- it('only triggers fetch once even when called multiple times', async () => {
193
- const fetchMock = vi.fn().mockResolvedValue({
194
- ok: true,
195
- json: () => Promise.resolve([{ name: 'release-2.25.7' }]),
196
- });
197
- vi.stubGlobal('fetch', fetchMock);
198
-
199
- const svc = new VersionHintService();
200
- svc.triggerLatestVersionFetch();
201
- svc.triggerLatestVersionFetch();
202
- svc.triggerLatestVersionFetch();
203
- await svc.waitForLatestVersion(1000);
204
-
205
- expect(fetchMock).toHaveBeenCalledOnce();
206
- });
207
-
208
- it('handles GitHub API errors gracefully (no crash, latestVersion stays null)', async () => {
209
- const fetchMock = vi.fn().mockResolvedValue({ ok: false });
210
- vi.stubGlobal('fetch', fetchMock);
211
-
212
- const svc = new VersionHintService();
213
- svc.triggerLatestVersionFetch();
214
- await svc.waitForLatestVersion(500);
215
-
216
- expect(svc.getLatestVersion()).toBeNull();
217
- });
218
-
219
- it('handles fetch network errors gracefully', async () => {
220
- const fetchMock = vi.fn().mockRejectedValue(new Error('Network error'));
221
- vi.stubGlobal('fetch', fetchMock);
222
-
223
- const svc = new VersionHintService();
224
- svc.triggerLatestVersionFetch();
225
- // Give async fire-and-forget time to complete
226
- await new Promise(r => setTimeout(r, 100));
227
-
228
- expect(svc.getLatestVersion()).toBeNull();
229
- });
230
- });
@@ -1,8 +0,0 @@
1
- {
2
- "extends": "./tsconfig.json",
3
- "compilerOptions": {
4
- "rootDir": "./src",
5
- "noEmit": false
6
- },
7
- "include": ["src/**/*"]
8
- }
package/vitest.config.ts DELETED
@@ -1,8 +0,0 @@
1
- import { defineConfig } from 'vitest/config';
2
-
3
- export default defineConfig({
4
- test: {
5
- environment: 'node',
6
- include: ['tests/**/*.test.ts'],
7
- },
8
- });