specforge-mcp 0.12.0 → 0.13.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 (258) hide show
  1. package/dist/index.js +0 -0
  2. package/package.json +1 -1
  3. package/dist/engine/agent-generator.test.d.ts +0 -2
  4. package/dist/engine/agent-generator.test.d.ts.map +0 -1
  5. package/dist/engine/agent-generator.test.js +0 -556
  6. package/dist/engine/agent-generator.test.js.map +0 -1
  7. package/dist/engine/analyzer.test.d.ts +0 -2
  8. package/dist/engine/analyzer.test.d.ts.map +0 -1
  9. package/dist/engine/analyzer.test.js +0 -1461
  10. package/dist/engine/analyzer.test.js.map +0 -1
  11. package/dist/engine/auditor.test.d.ts +0 -2
  12. package/dist/engine/auditor.test.d.ts.map +0 -1
  13. package/dist/engine/auditor.test.js +0 -2075
  14. package/dist/engine/auditor.test.js.map +0 -1
  15. package/dist/engine/doc-generator.test.d.ts +0 -2
  16. package/dist/engine/doc-generator.test.d.ts.map +0 -1
  17. package/dist/engine/doc-generator.test.js +0 -961
  18. package/dist/engine/doc-generator.test.js.map +0 -1
  19. package/dist/engine/estimator.test.d.ts +0 -2
  20. package/dist/engine/estimator.test.d.ts.map +0 -1
  21. package/dist/engine/estimator.test.js +0 -334
  22. package/dist/engine/estimator.test.js.map +0 -1
  23. package/dist/engine/skill-generator.test.d.ts +0 -2
  24. package/dist/engine/skill-generator.test.d.ts.map +0 -1
  25. package/dist/engine/skill-generator.test.js +0 -742
  26. package/dist/engine/skill-generator.test.js.map +0 -1
  27. package/dist/engine/validator.test.d.ts +0 -2
  28. package/dist/engine/validator.test.d.ts.map +0 -1
  29. package/dist/engine/validator.test.js +0 -2371
  30. package/dist/engine/validator.test.js.map +0 -1
  31. package/dist/engine/web-fetcher.test.d.ts +0 -2
  32. package/dist/engine/web-fetcher.test.d.ts.map +0 -1
  33. package/dist/engine/web-fetcher.test.js +0 -360
  34. package/dist/engine/web-fetcher.test.js.map +0 -1
  35. package/dist/i18n/index.test.d.ts +0 -2
  36. package/dist/i18n/index.test.d.ts.map +0 -1
  37. package/dist/i18n/index.test.js +0 -375
  38. package/dist/i18n/index.test.js.map +0 -1
  39. package/dist/index.test.d.ts +0 -2
  40. package/dist/index.test.d.ts.map +0 -1
  41. package/dist/index.test.js +0 -124
  42. package/dist/index.test.js.map +0 -1
  43. package/dist/resources/patterns.test.d.ts +0 -2
  44. package/dist/resources/patterns.test.d.ts.map +0 -1
  45. package/dist/resources/patterns.test.js +0 -142
  46. package/dist/resources/patterns.test.js.map +0 -1
  47. package/dist/resources/process.test.d.ts +0 -2
  48. package/dist/resources/process.test.d.ts.map +0 -1
  49. package/dist/resources/process.test.js +0 -48
  50. package/dist/resources/process.test.js.map +0 -1
  51. package/dist/resources/registry.test.d.ts +0 -2
  52. package/dist/resources/registry.test.d.ts.map +0 -1
  53. package/dist/resources/registry.test.js +0 -138
  54. package/dist/resources/registry.test.js.map +0 -1
  55. package/dist/resources/specs.test.d.ts +0 -2
  56. package/dist/resources/specs.test.d.ts.map +0 -1
  57. package/dist/resources/specs.test.js +0 -130
  58. package/dist/resources/specs.test.js.map +0 -1
  59. package/dist/resources/templates.test.d.ts +0 -2
  60. package/dist/resources/templates.test.d.ts.map +0 -1
  61. package/dist/resources/templates.test.js +0 -119
  62. package/dist/resources/templates.test.js.map +0 -1
  63. package/dist/smoke.test.d.ts +0 -2
  64. package/dist/smoke.test.d.ts.map +0 -1
  65. package/dist/smoke.test.js +0 -229
  66. package/dist/smoke.test.js.map +0 -1
  67. package/dist/storage/base-store.test.d.ts +0 -2
  68. package/dist/storage/base-store.test.d.ts.map +0 -1
  69. package/dist/storage/base-store.test.js +0 -180
  70. package/dist/storage/base-store.test.js.map +0 -1
  71. package/dist/storage/global-store.test.d.ts +0 -2
  72. package/dist/storage/global-store.test.d.ts.map +0 -1
  73. package/dist/storage/global-store.test.js +0 -327
  74. package/dist/storage/global-store.test.js.map +0 -1
  75. package/dist/storage/index.test.d.ts +0 -2
  76. package/dist/storage/index.test.d.ts.map +0 -1
  77. package/dist/storage/index.test.js +0 -56
  78. package/dist/storage/index.test.js.map +0 -1
  79. package/dist/storage/knowledge-store.test.d.ts +0 -2
  80. package/dist/storage/knowledge-store.test.d.ts.map +0 -1
  81. package/dist/storage/knowledge-store.test.js +0 -368
  82. package/dist/storage/knowledge-store.test.js.map +0 -1
  83. package/dist/storage/metrics-store.test.d.ts +0 -2
  84. package/dist/storage/metrics-store.test.d.ts.map +0 -1
  85. package/dist/storage/metrics-store.test.js +0 -212
  86. package/dist/storage/metrics-store.test.js.map +0 -1
  87. package/dist/storage/pattern-store.test.d.ts +0 -2
  88. package/dist/storage/pattern-store.test.d.ts.map +0 -1
  89. package/dist/storage/pattern-store.test.js +0 -224
  90. package/dist/storage/pattern-store.test.js.map +0 -1
  91. package/dist/storage/spec-store.test.d.ts +0 -2
  92. package/dist/storage/spec-store.test.d.ts.map +0 -1
  93. package/dist/storage/spec-store.test.js +0 -227
  94. package/dist/storage/spec-store.test.js.map +0 -1
  95. package/dist/tools/audit.test.d.ts +0 -2
  96. package/dist/tools/audit.test.d.ts.map +0 -1
  97. package/dist/tools/audit.test.js +0 -169
  98. package/dist/tools/audit.test.js.map +0 -1
  99. package/dist/tools/challenge-spec.test.d.ts +0 -2
  100. package/dist/tools/challenge-spec.test.d.ts.map +0 -1
  101. package/dist/tools/challenge-spec.test.js +0 -782
  102. package/dist/tools/challenge-spec.test.js.map +0 -1
  103. package/dist/tools/check-versions.test.d.ts +0 -2
  104. package/dist/tools/check-versions.test.d.ts.map +0 -1
  105. package/dist/tools/check-versions.test.js +0 -214
  106. package/dist/tools/check-versions.test.js.map +0 -1
  107. package/dist/tools/clarify-requirements.test.d.ts +0 -2
  108. package/dist/tools/clarify-requirements.test.d.ts.map +0 -1
  109. package/dist/tools/clarify-requirements.test.js +0 -161
  110. package/dist/tools/clarify-requirements.test.js.map +0 -1
  111. package/dist/tools/consult-docs.test.d.ts +0 -2
  112. package/dist/tools/consult-docs.test.d.ts.map +0 -1
  113. package/dist/tools/consult-docs.test.js +0 -140
  114. package/dist/tools/consult-docs.test.js.map +0 -1
  115. package/dist/tools/create-spec.test.d.ts +0 -2
  116. package/dist/tools/create-spec.test.d.ts.map +0 -1
  117. package/dist/tools/create-spec.test.js +0 -233
  118. package/dist/tools/create-spec.test.js.map +0 -1
  119. package/dist/tools/define-ui-contract.test.d.ts +0 -2
  120. package/dist/tools/define-ui-contract.test.d.ts.map +0 -1
  121. package/dist/tools/define-ui-contract.test.js +0 -479
  122. package/dist/tools/define-ui-contract.test.js.map +0 -1
  123. package/dist/tools/design-schema.test.d.ts +0 -2
  124. package/dist/tools/design-schema.test.d.ts.map +0 -1
  125. package/dist/tools/design-schema.test.js +0 -301
  126. package/dist/tools/design-schema.test.js.map +0 -1
  127. package/dist/tools/detect-agent.test.d.ts +0 -2
  128. package/dist/tools/detect-agent.test.d.ts.map +0 -1
  129. package/dist/tools/detect-agent.test.js +0 -133
  130. package/dist/tools/detect-agent.test.js.map +0 -1
  131. package/dist/tools/detect-drift.test.d.ts +0 -2
  132. package/dist/tools/detect-drift.test.d.ts.map +0 -1
  133. package/dist/tools/detect-drift.test.js +0 -312
  134. package/dist/tools/detect-drift.test.js.map +0 -1
  135. package/dist/tools/discover-mcps.test.d.ts +0 -2
  136. package/dist/tools/discover-mcps.test.d.ts.map +0 -1
  137. package/dist/tools/discover-mcps.test.js +0 -345
  138. package/dist/tools/discover-mcps.test.js.map +0 -1
  139. package/dist/tools/estimate.test.d.ts +0 -2
  140. package/dist/tools/estimate.test.d.ts.map +0 -1
  141. package/dist/tools/estimate.test.js +0 -137
  142. package/dist/tools/estimate.test.js.map +0 -1
  143. package/dist/tools/generate-adr.test.d.ts +0 -2
  144. package/dist/tools/generate-adr.test.d.ts.map +0 -1
  145. package/dist/tools/generate-adr.test.js +0 -206
  146. package/dist/tools/generate-adr.test.js.map +0 -1
  147. package/dist/tools/generate-checklist.test.d.ts +0 -2
  148. package/dist/tools/generate-checklist.test.d.ts.map +0 -1
  149. package/dist/tools/generate-checklist.test.js +0 -201
  150. package/dist/tools/generate-checklist.test.js.map +0 -1
  151. package/dist/tools/generate-docs.test.d.ts +0 -2
  152. package/dist/tools/generate-docs.test.d.ts.map +0 -1
  153. package/dist/tools/generate-docs.test.js +0 -183
  154. package/dist/tools/generate-docs.test.js.map +0 -1
  155. package/dist/tools/generate-execution-plan.test.d.ts +0 -2
  156. package/dist/tools/generate-execution-plan.test.d.ts.map +0 -1
  157. package/dist/tools/generate-execution-plan.test.js +0 -643
  158. package/dist/tools/generate-execution-plan.test.js.map +0 -1
  159. package/dist/tools/generate-rules.test.d.ts +0 -2
  160. package/dist/tools/generate-rules.test.d.ts.map +0 -1
  161. package/dist/tools/generate-rules.test.js +0 -148
  162. package/dist/tools/generate-rules.test.js.map +0 -1
  163. package/dist/tools/generate-skill.test.d.ts +0 -2
  164. package/dist/tools/generate-skill.test.d.ts.map +0 -1
  165. package/dist/tools/generate-skill.test.js +0 -138
  166. package/dist/tools/generate-skill.test.js.map +0 -1
  167. package/dist/tools/generate-sub-agent.test.d.ts +0 -2
  168. package/dist/tools/generate-sub-agent.test.d.ts.map +0 -1
  169. package/dist/tools/generate-sub-agent.test.js +0 -162
  170. package/dist/tools/generate-sub-agent.test.js.map +0 -1
  171. package/dist/tools/generate-tests.test.d.ts +0 -2
  172. package/dist/tools/generate-tests.test.d.ts.map +0 -1
  173. package/dist/tools/generate-tests.test.js +0 -222
  174. package/dist/tools/generate-tests.test.js.map +0 -1
  175. package/dist/tools/init-constitution.test.d.ts +0 -2
  176. package/dist/tools/init-constitution.test.d.ts.map +0 -1
  177. package/dist/tools/init-constitution.test.js +0 -398
  178. package/dist/tools/init-constitution.test.js.map +0 -1
  179. package/dist/tools/init-project.test.d.ts +0 -2
  180. package/dist/tools/init-project.test.d.ts.map +0 -1
  181. package/dist/tools/init-project.test.js +0 -158
  182. package/dist/tools/init-project.test.js.map +0 -1
  183. package/dist/tools/integrate-pm.test.d.ts +0 -2
  184. package/dist/tools/integrate-pm.test.d.ts.map +0 -1
  185. package/dist/tools/integrate-pm.test.js +0 -558
  186. package/dist/tools/integrate-pm.test.js.map +0 -1
  187. package/dist/tools/learn.test.d.ts +0 -2
  188. package/dist/tools/learn.test.d.ts.map +0 -1
  189. package/dist/tools/learn.test.js +0 -123
  190. package/dist/tools/learn.test.js.map +0 -1
  191. package/dist/tools/list-specs.test.d.ts +0 -2
  192. package/dist/tools/list-specs.test.d.ts.map +0 -1
  193. package/dist/tools/list-specs.test.js +0 -110
  194. package/dist/tools/list-specs.test.js.map +0 -1
  195. package/dist/tools/manage-context.test.d.ts +0 -2
  196. package/dist/tools/manage-context.test.d.ts.map +0 -1
  197. package/dist/tools/manage-context.test.js +0 -359
  198. package/dist/tools/manage-context.test.js.map +0 -1
  199. package/dist/tools/manage-git.test.d.ts +0 -2
  200. package/dist/tools/manage-git.test.d.ts.map +0 -1
  201. package/dist/tools/manage-git.test.js +0 -882
  202. package/dist/tools/manage-git.test.js.map +0 -1
  203. package/dist/tools/orchestrate.test.d.ts +0 -2
  204. package/dist/tools/orchestrate.test.d.ts.map +0 -1
  205. package/dist/tools/orchestrate.test.js +0 -1117
  206. package/dist/tools/orchestrate.test.js.map +0 -1
  207. package/dist/tools/reconcile-spec.test.d.ts +0 -2
  208. package/dist/tools/reconcile-spec.test.d.ts.map +0 -1
  209. package/dist/tools/reconcile-spec.test.js +0 -259
  210. package/dist/tools/reconcile-spec.test.js.map +0 -1
  211. package/dist/tools/register-platform-tools.test.d.ts +0 -2
  212. package/dist/tools/register-platform-tools.test.d.ts.map +0 -1
  213. package/dist/tools/register-platform-tools.test.js +0 -404
  214. package/dist/tools/register-platform-tools.test.js.map +0 -1
  215. package/dist/tools/register-spec-tools.test.d.ts +0 -2
  216. package/dist/tools/register-spec-tools.test.d.ts.map +0 -1
  217. package/dist/tools/register-spec-tools.test.js +0 -407
  218. package/dist/tools/register-spec-tools.test.js.map +0 -1
  219. package/dist/tools/reverse-engineer.test.d.ts +0 -2
  220. package/dist/tools/reverse-engineer.test.d.ts.map +0 -1
  221. package/dist/tools/reverse-engineer.test.js +0 -206
  222. package/dist/tools/reverse-engineer.test.js.map +0 -1
  223. package/dist/tools/schemas.d.ts +0 -20
  224. package/dist/tools/schemas.d.ts.map +0 -1
  225. package/dist/tools/schemas.js +0 -133
  226. package/dist/tools/schemas.js.map +0 -1
  227. package/dist/tools/schemas.test.d.ts +0 -2
  228. package/dist/tools/schemas.test.d.ts.map +0 -1
  229. package/dist/tools/schemas.test.js +0 -245
  230. package/dist/tools/schemas.test.js.map +0 -1
  231. package/dist/tools/set-locale.test.d.ts +0 -2
  232. package/dist/tools/set-locale.test.d.ts.map +0 -1
  233. package/dist/tools/set-locale.test.js +0 -74
  234. package/dist/tools/set-locale.test.js.map +0 -1
  235. package/dist/tools/suggest-mcps.test.d.ts +0 -2
  236. package/dist/tools/suggest-mcps.test.d.ts.map +0 -1
  237. package/dist/tools/suggest-mcps.test.js +0 -198
  238. package/dist/tools/suggest-mcps.test.js.map +0 -1
  239. package/dist/tools/suggest-stack.test.d.ts +0 -2
  240. package/dist/tools/suggest-stack.test.d.ts.map +0 -1
  241. package/dist/tools/suggest-stack.test.js +0 -181
  242. package/dist/tools/suggest-stack.test.js.map +0 -1
  243. package/dist/tools/suggest-tooling.test.d.ts +0 -2
  244. package/dist/tools/suggest-tooling.test.d.ts.map +0 -1
  245. package/dist/tools/suggest-tooling.test.js +0 -213
  246. package/dist/tools/suggest-tooling.test.js.map +0 -1
  247. package/dist/tools/summarize-spec.test.d.ts +0 -2
  248. package/dist/tools/summarize-spec.test.d.ts.map +0 -1
  249. package/dist/tools/summarize-spec.test.js +0 -180
  250. package/dist/tools/summarize-spec.test.js.map +0 -1
  251. package/dist/tools/update-status.test.d.ts +0 -2
  252. package/dist/tools/update-status.test.d.ts.map +0 -1
  253. package/dist/tools/update-status.test.js +0 -142
  254. package/dist/tools/update-status.test.js.map +0 -1
  255. package/dist/tools/validate.test.d.ts +0 -2
  256. package/dist/tools/validate.test.d.ts.map +0 -1
  257. package/dist/tools/validate.test.js +0 -137
  258. package/dist/tools/validate.test.js.map +0 -1
@@ -1,119 +0,0 @@
1
- // Tests for handleTemplatesResource
2
- import { describe, it, expect, vi } from 'vitest';
3
- vi.mock('../i18n/index.js', () => ({
4
- t: (key) => key,
5
- }));
6
- vi.mock('glob', () => ({
7
- glob: vi.fn(),
8
- }));
9
- vi.mock('node:fs/promises', () => ({
10
- readFile: vi.fn(),
11
- }));
12
- import { handleTemplatesResource, templatesResourceDefinition } from './templates.js';
13
- import { glob } from 'glob';
14
- import { readFile } from 'node:fs/promises';
15
- const mockGlob = vi.mocked(glob);
16
- const mockReadFile = vi.mocked(readFile);
17
- describe('handleTemplatesResource', () => {
18
- it('should return 6 built-in templates when no custom templates exist', async () => {
19
- mockGlob.mockResolvedValue([]);
20
- const result = await handleTemplatesResource();
21
- const parsed = JSON.parse(result);
22
- expect(parsed.builtIn).toBe(6);
23
- expect(parsed.custom).toBe(0);
24
- expect(parsed.count).toBe(6);
25
- expect(parsed.templates).toHaveLength(6);
26
- });
27
- it('should include all 6 built-in template types', async () => {
28
- mockGlob.mockResolvedValue([]);
29
- const result = await handleTemplatesResource();
30
- const parsed = JSON.parse(result);
31
- const ids = parsed.templates.map((t) => t.id);
32
- expect(ids).toContain('feature');
33
- expect(ids).toContain('refactor');
34
- expect(ids).toContain('bugfix');
35
- expect(ids).toContain('infra');
36
- expect(ids).toContain('docs');
37
- expect(ids).toContain('project');
38
- });
39
- it('should have source=built-in for all default templates', async () => {
40
- mockGlob.mockResolvedValue([]);
41
- const result = await handleTemplatesResource();
42
- const parsed = JSON.parse(result);
43
- for (const tmpl of parsed.templates) {
44
- expect(tmpl.source).toBe('built-in');
45
- }
46
- });
47
- it('should load custom templates and merge with built-in', async () => {
48
- mockGlob.mockResolvedValue(['data/global/templates/custom-api.json']);
49
- mockReadFile.mockResolvedValue(JSON.stringify({
50
- id: 'custom-api',
51
- name: 'Custom API Spec',
52
- description: 'Custom API template',
53
- type: 'feature',
54
- sections: ['metadata', 'interfaces'],
55
- source: 'will-be-overridden',
56
- }));
57
- const result = await handleTemplatesResource();
58
- const parsed = JSON.parse(result);
59
- expect(parsed.builtIn).toBe(6);
60
- expect(parsed.custom).toBe(1);
61
- expect(parsed.count).toBe(7);
62
- expect(parsed.templates).toHaveLength(7);
63
- const customTmpl = parsed.templates.find((t) => t.id === 'custom-api');
64
- expect(customTmpl).toBeDefined();
65
- expect(customTmpl.source).toBe('custom');
66
- });
67
- it('should skip malformed custom template files', async () => {
68
- mockGlob.mockResolvedValue([
69
- 'data/global/templates/good.json',
70
- 'data/global/templates/bad.json',
71
- ]);
72
- let callIdx = 0;
73
- mockReadFile.mockImplementation(() => {
74
- callIdx++;
75
- if (callIdx === 1) {
76
- return Promise.resolve(JSON.stringify({
77
- id: 'good-tmpl',
78
- name: 'Good Template',
79
- description: 'A good one',
80
- type: 'feature',
81
- sections: ['metadata'],
82
- }));
83
- }
84
- return Promise.resolve('{broken json');
85
- });
86
- const result = await handleTemplatesResource();
87
- const parsed = JSON.parse(result);
88
- expect(parsed.custom).toBe(1);
89
- expect(parsed.count).toBe(7);
90
- });
91
- it('should handle glob error for custom templates gracefully', async () => {
92
- mockGlob.mockRejectedValue(new Error('ENOENT'));
93
- const result = await handleTemplatesResource();
94
- const parsed = JSON.parse(result);
95
- // Should still return built-in templates
96
- expect(parsed.builtIn).toBe(6);
97
- expect(parsed.custom).toBe(0);
98
- expect(parsed.count).toBe(6);
99
- });
100
- it('should have sections array for each built-in template', async () => {
101
- mockGlob.mockResolvedValue([]);
102
- const result = await handleTemplatesResource();
103
- const parsed = JSON.parse(result);
104
- for (const tmpl of parsed.templates) {
105
- expect(Array.isArray(tmpl.sections)).toBe(true);
106
- expect(tmpl.sections.length).toBeGreaterThan(0);
107
- expect(tmpl.name).toBeDefined();
108
- expect(tmpl.description).toBeDefined();
109
- expect(tmpl.type).toBeDefined();
110
- }
111
- });
112
- it('should export resource definition', () => {
113
- expect(templatesResourceDefinition.uri).toBe('specforge://templates');
114
- expect(templatesResourceDefinition.name).toBe('Spec Templates');
115
- expect(templatesResourceDefinition.mimeType).toBe('application/json');
116
- expect(templatesResourceDefinition.description).toBe('resources.templates.description');
117
- });
118
- });
119
- //# sourceMappingURL=templates.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"templates.test.js","sourceRoot":"","sources":["../../src/resources/templates.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=smoke.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"smoke.test.d.ts","sourceRoot":"","sources":["../src/smoke.test.ts"],"names":[],"mappings":""}
@@ -1,229 +0,0 @@
1
- // smoke.test.ts — End-to-end smoke tests for the SpecForge MCP Server.
2
- //
3
- // PREREQUISITE: The server must be built before running these tests.
4
- // pnpm build (or: npm run build)
5
- //
6
- // These tests spawn the actual MCP server process (dist/index.js) and
7
- // communicate with it over stdio using JSON-RPC, verifying that the server
8
- // initializes correctly and exposes all expected tools and resources.
9
- /* eslint-disable @typescript-eslint/dot-notation */
10
- import { spawn } from 'node:child_process';
11
- import { resolve } from 'node:path';
12
- import { describe, it, expect, beforeAll, afterAll } from 'vitest';
13
- // ---------------------------------------------------------------------------
14
- // Constants
15
- // ---------------------------------------------------------------------------
16
- const SERVER_PATH = resolve(import.meta.dirname, '..', 'dist', 'index.js');
17
- const RESPONSE_TIMEOUT_MS = 5_000;
18
- const EXPECTED_TOOLS = [
19
- 'set_locale',
20
- 'init_project',
21
- 'init_constitution',
22
- 'clarify_requirements',
23
- 'create_spec',
24
- 'list_specs',
25
- 'update_status',
26
- 'estimate',
27
- 'reverse_engineer',
28
- 'validate',
29
- 'detect_drift',
30
- 'summarize_spec',
31
- 'generate_checklist',
32
- 'reconcile_spec',
33
- 'learn_pattern',
34
- 'audit',
35
- 'consult_docs',
36
- 'discover_mcps',
37
- 'suggest_mcps',
38
- 'generate_adr',
39
- 'design_schema',
40
- 'define_ui_contract',
41
- 'challenge_spec',
42
- 'generate_execution_plan',
43
- 'suggest_stack',
44
- 'check_versions',
45
- 'generate_skill',
46
- 'detect_agent',
47
- 'generate_sub_agent',
48
- 'generate_rules',
49
- 'suggest_tooling',
50
- 'generate_tests',
51
- 'generate_docs',
52
- 'manage_context',
53
- 'manage_git',
54
- 'orchestrate',
55
- 'integrate_pm',
56
- ];
57
- const EXPECTED_RESOURCE_NAMES = [
58
- 'SDD Process',
59
- 'Project Specs',
60
- 'Spec Templates',
61
- 'Learned Patterns',
62
- ];
63
- // ---------------------------------------------------------------------------
64
- // Helper: MCP Server process wrapper
65
- // ---------------------------------------------------------------------------
66
- let serverProcess = null;
67
- let requestId = 0;
68
- let buffer = '';
69
- /**
70
- * Sends a JSON-RPC request to the server and waits for the matching response.
71
- */
72
- function sendRequest(method, params = {}) {
73
- return new Promise((resolve, reject) => {
74
- if (!serverProcess?.stdin || !serverProcess.stdout) {
75
- reject(new Error('Server process is not running'));
76
- return;
77
- }
78
- requestId += 1;
79
- const id = requestId;
80
- const message = JSON.stringify({
81
- jsonrpc: '2.0',
82
- id,
83
- method,
84
- params,
85
- });
86
- const timeout = setTimeout(() => {
87
- reject(new Error(`Timed out waiting for response to "${method}" (id=${id})`));
88
- }, RESPONSE_TIMEOUT_MS);
89
- const onData = (chunk) => {
90
- buffer += chunk.toString();
91
- // Process all complete lines in the buffer
92
- let newlineIndex;
93
- while ((newlineIndex = buffer.indexOf('\n')) !== -1) {
94
- const line = buffer.slice(0, newlineIndex).trim();
95
- buffer = buffer.slice(newlineIndex + 1);
96
- if (!line) {
97
- continue;
98
- }
99
- try {
100
- const parsed = JSON.parse(line);
101
- if (parsed['id'] === id) {
102
- clearTimeout(timeout);
103
- serverProcess?.stdout?.off('data', onData);
104
- resolve(parsed);
105
- return;
106
- }
107
- }
108
- catch {
109
- // Not valid JSON yet — skip this line
110
- }
111
- }
112
- };
113
- serverProcess.stdout.on('data', onData);
114
- serverProcess.stdin.write(message + '\n');
115
- });
116
- }
117
- /**
118
- * Sends a JSON-RPC notification (no id, no response expected).
119
- */
120
- function sendNotification(method, params = {}) {
121
- if (!serverProcess?.stdin) {
122
- throw new Error('Server process is not running');
123
- }
124
- const message = JSON.stringify({
125
- jsonrpc: '2.0',
126
- method,
127
- params,
128
- });
129
- serverProcess.stdin.write(message + '\n');
130
- }
131
- // ---------------------------------------------------------------------------
132
- // Test suite
133
- // ---------------------------------------------------------------------------
134
- describe('SpecForge MCP Server — Smoke Tests', () => {
135
- let initResponse;
136
- beforeAll(async () => {
137
- // Spawn the MCP server as a child process
138
- serverProcess = spawn('node', [SERVER_PATH], {
139
- stdio: ['pipe', 'pipe', 'pipe'],
140
- env: { ...process.env, NODE_ENV: 'test' },
141
- });
142
- // Capture stderr for debugging (do not let it pollute test output)
143
- serverProcess.stderr?.on('data', (_chunk) => {
144
- // Uncomment for debugging: console.error('[server stderr]', _chunk.toString());
145
- });
146
- // Send the initialize handshake
147
- initResponse = await sendRequest('initialize', {
148
- protocolVersion: '2024-11-05',
149
- capabilities: {},
150
- clientInfo: { name: 'smoke-test', version: '0.1.0' },
151
- });
152
- // Complete the handshake with the initialized notification
153
- sendNotification('notifications/initialized');
154
- });
155
- afterAll(() => {
156
- if (serverProcess) {
157
- serverProcess.kill('SIGTERM');
158
- serverProcess = null;
159
- }
160
- });
161
- // -------------------------------------------------------------------------
162
- // 1. Server initialization
163
- // -------------------------------------------------------------------------
164
- it('should respond to initialize with protocolVersion', () => {
165
- const result = initResponse['result'];
166
- expect(result).toBeDefined();
167
- expect(result['protocolVersion']).toBe('2024-11-05');
168
- });
169
- it('should expose server capabilities in initialize response', () => {
170
- const result = initResponse['result'];
171
- const capabilities = result['capabilities'];
172
- expect(capabilities).toBeDefined();
173
- expect(capabilities['tools']).toBeDefined();
174
- expect(capabilities['resources']).toBeDefined();
175
- });
176
- it('should report correct server info', () => {
177
- const result = initResponse['result'];
178
- const serverInfo = result['serverInfo'];
179
- expect(serverInfo).toBeDefined();
180
- expect(serverInfo['name']).toBe('specforge');
181
- expect(serverInfo['version']).toBe('0.1.0');
182
- });
183
- // -------------------------------------------------------------------------
184
- // 2. Tools listing
185
- // -------------------------------------------------------------------------
186
- it('should list exactly 37 tools', async () => {
187
- const response = await sendRequest('tools/list', {});
188
- const result = response['result'];
189
- const tools = result['tools'];
190
- expect(tools).toHaveLength(37);
191
- });
192
- it('should include all expected tool names', async () => {
193
- const response = await sendRequest('tools/list', {});
194
- const result = response['result'];
195
- const tools = result['tools'];
196
- const toolNames = tools.map((tool) => tool['name']);
197
- for (const expectedTool of EXPECTED_TOOLS) {
198
- expect(toolNames).toContain(expectedTool);
199
- }
200
- });
201
- it('should include inputSchema on every tool', async () => {
202
- const response = await sendRequest('tools/list', {});
203
- const result = response['result'];
204
- const tools = result['tools'];
205
- for (const tool of tools) {
206
- expect(tool['inputSchema']).toBeDefined();
207
- expect(typeof tool['inputSchema']).toBe('object');
208
- }
209
- });
210
- // -------------------------------------------------------------------------
211
- // 3. Resources listing
212
- // -------------------------------------------------------------------------
213
- it('should list exactly 4 resources', async () => {
214
- const response = await sendRequest('resources/list', {});
215
- const result = response['result'];
216
- const resources = result['resources'];
217
- expect(resources).toHaveLength(4);
218
- });
219
- it('should include all expected resource names', async () => {
220
- const response = await sendRequest('resources/list', {});
221
- const result = response['result'];
222
- const resources = result['resources'];
223
- const resourceNames = resources.map((r) => r['name']);
224
- for (const expectedName of EXPECTED_RESOURCE_NAMES) {
225
- expect(resourceNames).toContain(expectedName);
226
- }
227
- });
228
- });
229
- //# sourceMappingURL=smoke.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"smoke.test.js","sourceRoot":"","sources":["../src/smoke.test.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,EAAE;AACF,qEAAqE;AACrE,qCAAqC;AACrC,EAAE;AACF,sEAAsE;AACtE,2EAA2E;AAC3E,sEAAsE;AAEtE,oDAAoD;AAEpD,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAEnE,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AAC3E,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAElC,MAAM,cAAc,GAAG;IACrB,YAAY;IACZ,cAAc;IACd,mBAAmB;IACnB,sBAAsB;IACtB,aAAa;IACb,YAAY;IACZ,eAAe;IACf,UAAU;IACV,kBAAkB;IAClB,UAAU;IACV,cAAc;IACd,gBAAgB;IAChB,oBAAoB;IACpB,gBAAgB;IAChB,eAAe;IACf,OAAO;IACP,cAAc;IACd,eAAe;IACf,cAAc;IACd,cAAc;IACd,eAAe;IACf,oBAAoB;IACpB,gBAAgB;IAChB,yBAAyB;IACzB,eAAe;IACf,gBAAgB;IAChB,gBAAgB;IAChB,cAAc;IACd,oBAAoB;IACpB,gBAAgB;IAChB,iBAAiB;IACjB,gBAAgB;IAChB,eAAe;IACf,gBAAgB;IAChB,YAAY;IACZ,aAAa;IACb,cAAc;CACN,CAAC;AAEX,MAAM,uBAAuB,GAAG;IAC9B,aAAa;IACb,eAAe;IACf,gBAAgB;IAChB,kBAAkB;CACV,CAAC;AAEX,8EAA8E;AAC9E,qCAAqC;AACrC,8EAA8E;AAE9E,IAAI,aAAa,GAAwB,IAAI,CAAC;AAC9C,IAAI,SAAS,GAAG,CAAC,CAAC;AAClB,IAAI,MAAM,GAAG,EAAE,CAAC;AAEhB;;GAEG;AACH,SAAS,WAAW,CAClB,MAAc,EACd,SAAkC,EAAE;IAEpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,CAAC,aAAa,EAAE,KAAK,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;YACnD,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,SAAS,IAAI,CAAC,CAAC;QACf,MAAM,EAAE,GAAG,SAAS,CAAC;QAErB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;YAC7B,OAAO,EAAE,KAAK;YACd,EAAE;YACF,MAAM;YACN,MAAM;SACP,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,MAAM,CAAC,IAAI,KAAK,CAAC,sCAAsC,MAAM,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;QAChF,CAAC,EAAE,mBAAmB,CAAC,CAAC;QAExB,MAAM,MAAM,GAAG,CAAC,KAAa,EAAQ,EAAE;YACrC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAE3B,2CAA2C;YAC3C,IAAI,YAAoB,CAAC;YACzB,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBACpD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC;gBAClD,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;gBAExC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,SAAS;gBACX,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;oBAC3D,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;wBACxB,YAAY,CAAC,OAAO,CAAC,CAAC;wBACtB,aAAa,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;wBAC3C,OAAO,CAAC,MAAM,CAAC,CAAC;wBAChB,OAAO;oBACT,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,sCAAsC;gBACxC,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACxC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,MAAc,EAAE,SAAkC,EAAE;IAC5E,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7B,OAAO,EAAE,KAAK;QACd,MAAM;QACN,MAAM;KACP,CAAC,CAAC;IAEH,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;AAC5C,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAClD,IAAI,YAAqC,CAAC;IAE1C,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,0CAA0C;QAC1C,aAAa,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE;YAC3C,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE;SAC1C,CAAC,CAAC;QAEH,mEAAmE;QACnE,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,MAAc,EAAE,EAAE;YAClD,gFAAgF;QAClF,CAAC,CAAC,CAAC;QAEH,gCAAgC;QAChC,YAAY,GAAG,MAAM,WAAW,CAAC,YAAY,EAAE;YAC7C,eAAe,EAAE,YAAY;YAC7B,YAAY,EAAE,EAAE;YAChB,UAAU,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE;SACrD,CAAC,CAAC;QAEH,2DAA2D;QAC3D,gBAAgB,CAAC,2BAA2B,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAG,EAAE;QACZ,IAAI,aAAa,EAAE,CAAC;YAClB,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9B,aAAa,GAAG,IAAI,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,4EAA4E;IAC5E,2BAA2B;IAC3B,4EAA4E;IAE5E,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAA4B,CAAC;QACjE,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAA4B,CAAC;QACjE,MAAM,YAAY,GAAG,MAAM,CAAC,cAAc,CAA4B,CAAC;QACvE,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5C,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAA4B,CAAC;QACjE,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAA4B,CAAC;QACnE,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC7C,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,4EAA4E;IAC5E,mBAAmB;IACnB,4EAA4E;IAE5E,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAA4B,CAAC;QAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAA8B,CAAC;QAC3D,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAA4B,CAAC;QAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAA8B,CAAC;QAC3D,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAW,CAAC,CAAC;QAE9D,KAAK,MAAM,YAAY,IAAI,cAAc,EAAE,CAAC;YAC1C,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAA4B,CAAC;QAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAA8B,CAAC;QAE3D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAC1C,MAAM,CAAC,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,4EAA4E;IAC5E,uBAAuB;IACvB,4EAA4E;IAE5E,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAA4B,CAAC;QAC7D,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAA8B,CAAC;QACnE,MAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAA4B,CAAC;QAC7D,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAA8B,CAAC;QACnE,MAAM,aAAa,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAW,CAAC,CAAC;QAEhE,KAAK,MAAM,YAAY,IAAI,uBAAuB,EAAE,CAAC;YACnD,MAAM,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=base-store.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base-store.test.d.ts","sourceRoot":"","sources":["../../src/storage/base-store.test.ts"],"names":[],"mappings":""}
@@ -1,180 +0,0 @@
1
- // base-store.test.ts — Unit tests for base store (JSON persistence helpers)
2
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
3
- import { mkdtemp, rm, readFile, writeFile, mkdir } from 'node:fs/promises';
4
- import { join } from 'node:path';
5
- import { tmpdir } from 'node:os';
6
- import { hashProjectPath, readJson, writeJson, projectDataDir, globalDataDir, } from './base-store.js';
7
- let tempDir;
8
- beforeEach(async () => {
9
- tempDir = await mkdtemp(join(tmpdir(), 'sdd-base-store-test-'));
10
- });
11
- afterEach(async () => {
12
- await rm(tempDir, { recursive: true, force: true });
13
- });
14
- // =============================================================================
15
- // hashProjectPath
16
- // =============================================================================
17
- describe('hashProjectPath', () => {
18
- it('should return a 16-character hex string', () => {
19
- const hash = hashProjectPath('/some/project/path');
20
- expect(hash).toMatch(/^[0-9a-f]{16}$/);
21
- expect(hash).toHaveLength(16);
22
- });
23
- it('should produce consistent hashes for the same path', () => {
24
- const hash1 = hashProjectPath('/my/project');
25
- const hash2 = hashProjectPath('/my/project');
26
- expect(hash1).toBe(hash2);
27
- });
28
- it('should produce different hashes for different paths', () => {
29
- const hash1 = hashProjectPath('/path/a');
30
- const hash2 = hashProjectPath('/path/b');
31
- expect(hash1).not.toBe(hash2);
32
- });
33
- it('should handle empty string', () => {
34
- const hash = hashProjectPath('');
35
- expect(hash).toMatch(/^[0-9a-f]{16}$/);
36
- });
37
- it('should handle paths with special characters', () => {
38
- const hash = hashProjectPath('/path/with spaces/and-special_chars!@#');
39
- expect(hash).toMatch(/^[0-9a-f]{16}$/);
40
- });
41
- it('should handle very long paths', () => {
42
- const longPath = '/a'.repeat(1000);
43
- const hash = hashProjectPath(longPath);
44
- expect(hash).toMatch(/^[0-9a-f]{16}$/);
45
- });
46
- });
47
- // =============================================================================
48
- // readJson
49
- // =============================================================================
50
- describe('readJson', () => {
51
- it('should return default value when file does not exist', async () => {
52
- const result = await readJson(join(tempDir, 'nonexistent.json'), { key: 'default' });
53
- expect(result).toEqual({ key: 'default' });
54
- });
55
- it('should return default value when file does not exist (array default)', async () => {
56
- const result = await readJson(join(tempDir, 'nonexistent.json'), []);
57
- expect(result).toEqual([]);
58
- });
59
- it('should parse and return JSON when file exists', async () => {
60
- const filePath = join(tempDir, 'data.json');
61
- await writeFile(filePath, JSON.stringify({ name: 'test', count: 42 }), 'utf-8');
62
- const result = await readJson(filePath, {});
63
- expect(result).toEqual({ name: 'test', count: 42 });
64
- });
65
- it('should return nested objects correctly', async () => {
66
- const data = { level1: { level2: { value: 'deep' } } };
67
- const filePath = join(tempDir, 'nested.json');
68
- await writeFile(filePath, JSON.stringify(data), 'utf-8');
69
- const result = await readJson(filePath, {});
70
- expect(result).toEqual(data);
71
- });
72
- it('should throw on non-ENOENT errors (e.g., invalid JSON)', async () => {
73
- const filePath = join(tempDir, 'bad.json');
74
- await writeFile(filePath, 'not-valid-json{{{', 'utf-8');
75
- await expect(readJson(filePath, {})).rejects.toThrow();
76
- });
77
- it('should throw on permission errors (non-ENOENT)', async () => {
78
- // Simulate a non-ENOENT error by passing a directory as a file path
79
- // readFile on a directory throws EISDIR on some systems
80
- const dirPath = join(tempDir, 'adir');
81
- await mkdir(dirPath);
82
- await expect(readJson(dirPath, {})).rejects.toThrow();
83
- });
84
- it('should return default when parent directory does not exist', async () => {
85
- const filePath = join(tempDir, 'nonexistent-dir', 'deep', 'file.json');
86
- const result = await readJson(filePath, 'fallback');
87
- expect(result).toBe('fallback');
88
- });
89
- });
90
- // =============================================================================
91
- // writeJson
92
- // =============================================================================
93
- describe('writeJson', () => {
94
- it('should write JSON to a file', async () => {
95
- const filePath = join(tempDir, 'output.json');
96
- const data = { hello: 'world', num: 123 };
97
- await writeJson(filePath, data);
98
- const content = await readFile(filePath, 'utf-8');
99
- expect(JSON.parse(content)).toEqual(data);
100
- });
101
- it('should create parent directories as needed', async () => {
102
- const filePath = join(tempDir, 'deep', 'nested', 'dir', 'output.json');
103
- const data = { created: true };
104
- await writeJson(filePath, data);
105
- const content = await readFile(filePath, 'utf-8');
106
- expect(JSON.parse(content)).toEqual(data);
107
- });
108
- it('should format JSON with 2-space indentation', async () => {
109
- const filePath = join(tempDir, 'formatted.json');
110
- const data = { key: 'value' };
111
- await writeJson(filePath, data);
112
- const content = await readFile(filePath, 'utf-8');
113
- expect(content).toBe(JSON.stringify(data, null, 2));
114
- });
115
- it('should overwrite existing files', async () => {
116
- const filePath = join(tempDir, 'overwrite.json');
117
- await writeJson(filePath, { version: 1 });
118
- await writeJson(filePath, { version: 2 });
119
- const content = await readFile(filePath, 'utf-8');
120
- expect(JSON.parse(content)).toEqual({ version: 2 });
121
- });
122
- it('should write arrays', async () => {
123
- const filePath = join(tempDir, 'array.json');
124
- await writeJson(filePath, [1, 2, 3]);
125
- const content = await readFile(filePath, 'utf-8');
126
- expect(JSON.parse(content)).toEqual([1, 2, 3]);
127
- });
128
- it('should write null', async () => {
129
- const filePath = join(tempDir, 'null.json');
130
- await writeJson(filePath, null);
131
- const content = await readFile(filePath, 'utf-8');
132
- expect(JSON.parse(content)).toBeNull();
133
- });
134
- });
135
- // =============================================================================
136
- // projectDataDir
137
- // =============================================================================
138
- describe('projectDataDir', () => {
139
- it('should return expected path format', () => {
140
- const dir = projectDataDir('abc123');
141
- expect(dir).toBe('data/projects/abc123');
142
- });
143
- it('should include the project ID in the path', () => {
144
- const dir = projectDataDir('my-project-id');
145
- expect(dir).toContain('my-project-id');
146
- });
147
- });
148
- // =============================================================================
149
- // globalDataDir
150
- // =============================================================================
151
- describe('globalDataDir', () => {
152
- it('should return the global data directory path', () => {
153
- const dir = globalDataDir();
154
- expect(dir).toBe('data/global');
155
- });
156
- });
157
- // =============================================================================
158
- // readJson + writeJson round-trip
159
- // =============================================================================
160
- describe('readJson + writeJson round-trip', () => {
161
- it('should write then read the same data', async () => {
162
- const filePath = join(tempDir, 'roundtrip.json');
163
- const data = { specs: [{ id: 'SPEC-001', title: 'Test' }], count: 1 };
164
- await writeJson(filePath, data);
165
- const result = await readJson(filePath, {});
166
- expect(result).toEqual(data);
167
- });
168
- it('should handle complex nested structures', async () => {
169
- const filePath = join(tempDir, 'complex.json');
170
- const data = {
171
- a: { b: { c: { d: [1, 2, { e: 'f' }] } } },
172
- nullVal: null,
173
- bool: true,
174
- };
175
- await writeJson(filePath, data);
176
- const result = await readJson(filePath, {});
177
- expect(result).toEqual(data);
178
- });
179
- });
180
- //# sourceMappingURL=base-store.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base-store.test.js","sourceRoot":"","sources":["../../src/storage/base-store.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=global-store.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"global-store.test.d.ts","sourceRoot":"","sources":["../../src/storage/global-store.test.ts"],"names":[],"mappings":""}