specforge-mcp 0.1.1 → 0.2.2

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 (287) hide show
  1. package/README.md +31 -1
  2. package/dist/config/version.d.ts +2 -0
  3. package/dist/config/version.d.ts.map +1 -0
  4. package/dist/config/version.js +9 -0
  5. package/dist/config/version.js.map +1 -0
  6. package/dist/config/version.ts +11 -0
  7. package/dist/engine/detectors/library-detector-langs2.d.ts.map +1 -1
  8. package/dist/engine/detectors/library-detector-langs2.js.map +1 -1
  9. package/dist/engine/mermaid-generator.d.ts.map +1 -1
  10. package/dist/engine/mermaid-generator.js +12 -2
  11. package/dist/engine/mermaid-generator.js.map +1 -1
  12. package/dist/index.js +2 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/tools/create-spec-hu/hu-body-generators.d.ts.map +1 -1
  15. package/dist/tools/create-spec-hu/hu-body-generators.js +7 -1
  16. package/dist/tools/create-spec-hu/hu-body-generators.js.map +1 -1
  17. package/dist/tools/create-spec-tech/ficha-content.d.ts.map +1 -1
  18. package/dist/tools/create-spec-tech/ficha-content.js +4 -2
  19. package/dist/tools/create-spec-tech/ficha-content.js.map +1 -1
  20. package/dist/tools/create-spec.d.ts.map +1 -1
  21. package/dist/tools/create-spec.js +4 -3
  22. package/dist/tools/create-spec.js.map +1 -1
  23. package/dist/tools/register-spec-tools/core-spec-tools.d.ts.map +1 -1
  24. package/dist/tools/register-spec-tools/core-spec-tools.js +4 -0
  25. package/dist/tools/register-spec-tools/core-spec-tools.js.map +1 -1
  26. package/dist/types/spec/core.d.ts +1 -0
  27. package/dist/types/spec/core.d.ts.map +1 -1
  28. package/dist/types/spec/inputs.d.ts +1 -0
  29. package/dist/types/spec/inputs.d.ts.map +1 -1
  30. package/package.json +27 -18
  31. package/src/config/version.ts +11 -0
  32. package/dist/engine/agent-generator.test.d.ts +0 -2
  33. package/dist/engine/agent-generator.test.d.ts.map +0 -1
  34. package/dist/engine/agent-generator.test.js +0 -556
  35. package/dist/engine/agent-generator.test.js.map +0 -1
  36. package/dist/engine/analyzer.test.d.ts +0 -2
  37. package/dist/engine/analyzer.test.d.ts.map +0 -1
  38. package/dist/engine/analyzer.test.js +0 -1461
  39. package/dist/engine/analyzer.test.js.map +0 -1
  40. package/dist/engine/auditor.test.d.ts +0 -2
  41. package/dist/engine/auditor.test.d.ts.map +0 -1
  42. package/dist/engine/auditor.test.js +0 -2075
  43. package/dist/engine/auditor.test.js.map +0 -1
  44. package/dist/engine/doc-generator.test.d.ts +0 -2
  45. package/dist/engine/doc-generator.test.d.ts.map +0 -1
  46. package/dist/engine/doc-generator.test.js +0 -961
  47. package/dist/engine/doc-generator.test.js.map +0 -1
  48. package/dist/engine/estimator.test.d.ts +0 -2
  49. package/dist/engine/estimator.test.d.ts.map +0 -1
  50. package/dist/engine/estimator.test.js +0 -334
  51. package/dist/engine/estimator.test.js.map +0 -1
  52. package/dist/engine/skill-generator.test.d.ts +0 -2
  53. package/dist/engine/skill-generator.test.d.ts.map +0 -1
  54. package/dist/engine/skill-generator.test.js +0 -742
  55. package/dist/engine/skill-generator.test.js.map +0 -1
  56. package/dist/engine/validator.test.d.ts +0 -2
  57. package/dist/engine/validator.test.d.ts.map +0 -1
  58. package/dist/engine/validator.test.js +0 -2371
  59. package/dist/engine/validator.test.js.map +0 -1
  60. package/dist/engine/web-fetcher.test.d.ts +0 -2
  61. package/dist/engine/web-fetcher.test.d.ts.map +0 -1
  62. package/dist/engine/web-fetcher.test.js +0 -360
  63. package/dist/engine/web-fetcher.test.js.map +0 -1
  64. package/dist/i18n/index.test.d.ts +0 -2
  65. package/dist/i18n/index.test.d.ts.map +0 -1
  66. package/dist/i18n/index.test.js +0 -375
  67. package/dist/i18n/index.test.js.map +0 -1
  68. package/dist/index.test.d.ts +0 -2
  69. package/dist/index.test.d.ts.map +0 -1
  70. package/dist/index.test.js +0 -124
  71. package/dist/index.test.js.map +0 -1
  72. package/dist/resources/patterns.test.d.ts +0 -2
  73. package/dist/resources/patterns.test.d.ts.map +0 -1
  74. package/dist/resources/patterns.test.js +0 -142
  75. package/dist/resources/patterns.test.js.map +0 -1
  76. package/dist/resources/process.test.d.ts +0 -2
  77. package/dist/resources/process.test.d.ts.map +0 -1
  78. package/dist/resources/process.test.js +0 -48
  79. package/dist/resources/process.test.js.map +0 -1
  80. package/dist/resources/registry.test.d.ts +0 -2
  81. package/dist/resources/registry.test.d.ts.map +0 -1
  82. package/dist/resources/registry.test.js +0 -138
  83. package/dist/resources/registry.test.js.map +0 -1
  84. package/dist/resources/specs.test.d.ts +0 -2
  85. package/dist/resources/specs.test.d.ts.map +0 -1
  86. package/dist/resources/specs.test.js +0 -130
  87. package/dist/resources/specs.test.js.map +0 -1
  88. package/dist/resources/templates.test.d.ts +0 -2
  89. package/dist/resources/templates.test.d.ts.map +0 -1
  90. package/dist/resources/templates.test.js +0 -119
  91. package/dist/resources/templates.test.js.map +0 -1
  92. package/dist/smoke.test.d.ts +0 -2
  93. package/dist/smoke.test.d.ts.map +0 -1
  94. package/dist/smoke.test.js +0 -229
  95. package/dist/smoke.test.js.map +0 -1
  96. package/dist/storage/base-store.test.d.ts +0 -2
  97. package/dist/storage/base-store.test.d.ts.map +0 -1
  98. package/dist/storage/base-store.test.js +0 -180
  99. package/dist/storage/base-store.test.js.map +0 -1
  100. package/dist/storage/global-store.test.d.ts +0 -2
  101. package/dist/storage/global-store.test.d.ts.map +0 -1
  102. package/dist/storage/global-store.test.js +0 -327
  103. package/dist/storage/global-store.test.js.map +0 -1
  104. package/dist/storage/index.test.d.ts +0 -2
  105. package/dist/storage/index.test.d.ts.map +0 -1
  106. package/dist/storage/index.test.js +0 -56
  107. package/dist/storage/index.test.js.map +0 -1
  108. package/dist/storage/knowledge-store.test.d.ts +0 -2
  109. package/dist/storage/knowledge-store.test.d.ts.map +0 -1
  110. package/dist/storage/knowledge-store.test.js +0 -368
  111. package/dist/storage/knowledge-store.test.js.map +0 -1
  112. package/dist/storage/metrics-store.test.d.ts +0 -2
  113. package/dist/storage/metrics-store.test.d.ts.map +0 -1
  114. package/dist/storage/metrics-store.test.js +0 -212
  115. package/dist/storage/metrics-store.test.js.map +0 -1
  116. package/dist/storage/pattern-store.test.d.ts +0 -2
  117. package/dist/storage/pattern-store.test.d.ts.map +0 -1
  118. package/dist/storage/pattern-store.test.js +0 -224
  119. package/dist/storage/pattern-store.test.js.map +0 -1
  120. package/dist/storage/spec-store.test.d.ts +0 -2
  121. package/dist/storage/spec-store.test.d.ts.map +0 -1
  122. package/dist/storage/spec-store.test.js +0 -227
  123. package/dist/storage/spec-store.test.js.map +0 -1
  124. package/dist/tools/audit.test.d.ts +0 -2
  125. package/dist/tools/audit.test.d.ts.map +0 -1
  126. package/dist/tools/audit.test.js +0 -169
  127. package/dist/tools/audit.test.js.map +0 -1
  128. package/dist/tools/challenge-spec.test.d.ts +0 -2
  129. package/dist/tools/challenge-spec.test.d.ts.map +0 -1
  130. package/dist/tools/challenge-spec.test.js +0 -782
  131. package/dist/tools/challenge-spec.test.js.map +0 -1
  132. package/dist/tools/check-versions.test.d.ts +0 -2
  133. package/dist/tools/check-versions.test.d.ts.map +0 -1
  134. package/dist/tools/check-versions.test.js +0 -214
  135. package/dist/tools/check-versions.test.js.map +0 -1
  136. package/dist/tools/clarify-requirements.test.d.ts +0 -2
  137. package/dist/tools/clarify-requirements.test.d.ts.map +0 -1
  138. package/dist/tools/clarify-requirements.test.js +0 -161
  139. package/dist/tools/clarify-requirements.test.js.map +0 -1
  140. package/dist/tools/consult-docs.test.d.ts +0 -2
  141. package/dist/tools/consult-docs.test.d.ts.map +0 -1
  142. package/dist/tools/consult-docs.test.js +0 -140
  143. package/dist/tools/consult-docs.test.js.map +0 -1
  144. package/dist/tools/create-spec.test.d.ts +0 -2
  145. package/dist/tools/create-spec.test.d.ts.map +0 -1
  146. package/dist/tools/create-spec.test.js +0 -233
  147. package/dist/tools/create-spec.test.js.map +0 -1
  148. package/dist/tools/define-ui-contract.test.d.ts +0 -2
  149. package/dist/tools/define-ui-contract.test.d.ts.map +0 -1
  150. package/dist/tools/define-ui-contract.test.js +0 -479
  151. package/dist/tools/define-ui-contract.test.js.map +0 -1
  152. package/dist/tools/design-schema.test.d.ts +0 -2
  153. package/dist/tools/design-schema.test.d.ts.map +0 -1
  154. package/dist/tools/design-schema.test.js +0 -301
  155. package/dist/tools/design-schema.test.js.map +0 -1
  156. package/dist/tools/detect-agent.test.d.ts +0 -2
  157. package/dist/tools/detect-agent.test.d.ts.map +0 -1
  158. package/dist/tools/detect-agent.test.js +0 -133
  159. package/dist/tools/detect-agent.test.js.map +0 -1
  160. package/dist/tools/detect-drift.test.d.ts +0 -2
  161. package/dist/tools/detect-drift.test.d.ts.map +0 -1
  162. package/dist/tools/detect-drift.test.js +0 -312
  163. package/dist/tools/detect-drift.test.js.map +0 -1
  164. package/dist/tools/discover-mcps.test.d.ts +0 -2
  165. package/dist/tools/discover-mcps.test.d.ts.map +0 -1
  166. package/dist/tools/discover-mcps.test.js +0 -345
  167. package/dist/tools/discover-mcps.test.js.map +0 -1
  168. package/dist/tools/estimate.test.d.ts +0 -2
  169. package/dist/tools/estimate.test.d.ts.map +0 -1
  170. package/dist/tools/estimate.test.js +0 -137
  171. package/dist/tools/estimate.test.js.map +0 -1
  172. package/dist/tools/generate-adr.test.d.ts +0 -2
  173. package/dist/tools/generate-adr.test.d.ts.map +0 -1
  174. package/dist/tools/generate-adr.test.js +0 -206
  175. package/dist/tools/generate-adr.test.js.map +0 -1
  176. package/dist/tools/generate-checklist.test.d.ts +0 -2
  177. package/dist/tools/generate-checklist.test.d.ts.map +0 -1
  178. package/dist/tools/generate-checklist.test.js +0 -201
  179. package/dist/tools/generate-checklist.test.js.map +0 -1
  180. package/dist/tools/generate-docs.test.d.ts +0 -2
  181. package/dist/tools/generate-docs.test.d.ts.map +0 -1
  182. package/dist/tools/generate-docs.test.js +0 -183
  183. package/dist/tools/generate-docs.test.js.map +0 -1
  184. package/dist/tools/generate-execution-plan.test.d.ts +0 -2
  185. package/dist/tools/generate-execution-plan.test.d.ts.map +0 -1
  186. package/dist/tools/generate-execution-plan.test.js +0 -643
  187. package/dist/tools/generate-execution-plan.test.js.map +0 -1
  188. package/dist/tools/generate-rules.test.d.ts +0 -2
  189. package/dist/tools/generate-rules.test.d.ts.map +0 -1
  190. package/dist/tools/generate-rules.test.js +0 -148
  191. package/dist/tools/generate-rules.test.js.map +0 -1
  192. package/dist/tools/generate-skill.test.d.ts +0 -2
  193. package/dist/tools/generate-skill.test.d.ts.map +0 -1
  194. package/dist/tools/generate-skill.test.js +0 -138
  195. package/dist/tools/generate-skill.test.js.map +0 -1
  196. package/dist/tools/generate-sub-agent.test.d.ts +0 -2
  197. package/dist/tools/generate-sub-agent.test.d.ts.map +0 -1
  198. package/dist/tools/generate-sub-agent.test.js +0 -162
  199. package/dist/tools/generate-sub-agent.test.js.map +0 -1
  200. package/dist/tools/generate-tests.test.d.ts +0 -2
  201. package/dist/tools/generate-tests.test.d.ts.map +0 -1
  202. package/dist/tools/generate-tests.test.js +0 -222
  203. package/dist/tools/generate-tests.test.js.map +0 -1
  204. package/dist/tools/init-constitution.test.d.ts +0 -2
  205. package/dist/tools/init-constitution.test.d.ts.map +0 -1
  206. package/dist/tools/init-constitution.test.js +0 -398
  207. package/dist/tools/init-constitution.test.js.map +0 -1
  208. package/dist/tools/init-project.test.d.ts +0 -2
  209. package/dist/tools/init-project.test.d.ts.map +0 -1
  210. package/dist/tools/init-project.test.js +0 -158
  211. package/dist/tools/init-project.test.js.map +0 -1
  212. package/dist/tools/integrate-pm.test.d.ts +0 -2
  213. package/dist/tools/integrate-pm.test.d.ts.map +0 -1
  214. package/dist/tools/integrate-pm.test.js +0 -558
  215. package/dist/tools/integrate-pm.test.js.map +0 -1
  216. package/dist/tools/learn.test.d.ts +0 -2
  217. package/dist/tools/learn.test.d.ts.map +0 -1
  218. package/dist/tools/learn.test.js +0 -123
  219. package/dist/tools/learn.test.js.map +0 -1
  220. package/dist/tools/list-specs.test.d.ts +0 -2
  221. package/dist/tools/list-specs.test.d.ts.map +0 -1
  222. package/dist/tools/list-specs.test.js +0 -110
  223. package/dist/tools/list-specs.test.js.map +0 -1
  224. package/dist/tools/manage-context.test.d.ts +0 -2
  225. package/dist/tools/manage-context.test.d.ts.map +0 -1
  226. package/dist/tools/manage-context.test.js +0 -359
  227. package/dist/tools/manage-context.test.js.map +0 -1
  228. package/dist/tools/manage-git.test.d.ts +0 -2
  229. package/dist/tools/manage-git.test.d.ts.map +0 -1
  230. package/dist/tools/manage-git.test.js +0 -882
  231. package/dist/tools/manage-git.test.js.map +0 -1
  232. package/dist/tools/orchestrate.test.d.ts +0 -2
  233. package/dist/tools/orchestrate.test.d.ts.map +0 -1
  234. package/dist/tools/orchestrate.test.js +0 -1117
  235. package/dist/tools/orchestrate.test.js.map +0 -1
  236. package/dist/tools/reconcile-spec.test.d.ts +0 -2
  237. package/dist/tools/reconcile-spec.test.d.ts.map +0 -1
  238. package/dist/tools/reconcile-spec.test.js +0 -259
  239. package/dist/tools/reconcile-spec.test.js.map +0 -1
  240. package/dist/tools/register-platform-tools.test.d.ts +0 -2
  241. package/dist/tools/register-platform-tools.test.d.ts.map +0 -1
  242. package/dist/tools/register-platform-tools.test.js +0 -404
  243. package/dist/tools/register-platform-tools.test.js.map +0 -1
  244. package/dist/tools/register-spec-tools.test.d.ts +0 -2
  245. package/dist/tools/register-spec-tools.test.d.ts.map +0 -1
  246. package/dist/tools/register-spec-tools.test.js +0 -407
  247. package/dist/tools/register-spec-tools.test.js.map +0 -1
  248. package/dist/tools/reverse-engineer.test.d.ts +0 -2
  249. package/dist/tools/reverse-engineer.test.d.ts.map +0 -1
  250. package/dist/tools/reverse-engineer.test.js +0 -206
  251. package/dist/tools/reverse-engineer.test.js.map +0 -1
  252. package/dist/tools/schemas.d.ts +0 -20
  253. package/dist/tools/schemas.d.ts.map +0 -1
  254. package/dist/tools/schemas.js +0 -133
  255. package/dist/tools/schemas.js.map +0 -1
  256. package/dist/tools/schemas.test.d.ts +0 -2
  257. package/dist/tools/schemas.test.d.ts.map +0 -1
  258. package/dist/tools/schemas.test.js +0 -245
  259. package/dist/tools/schemas.test.js.map +0 -1
  260. package/dist/tools/set-locale.test.d.ts +0 -2
  261. package/dist/tools/set-locale.test.d.ts.map +0 -1
  262. package/dist/tools/set-locale.test.js +0 -74
  263. package/dist/tools/set-locale.test.js.map +0 -1
  264. package/dist/tools/suggest-mcps.test.d.ts +0 -2
  265. package/dist/tools/suggest-mcps.test.d.ts.map +0 -1
  266. package/dist/tools/suggest-mcps.test.js +0 -198
  267. package/dist/tools/suggest-mcps.test.js.map +0 -1
  268. package/dist/tools/suggest-stack.test.d.ts +0 -2
  269. package/dist/tools/suggest-stack.test.d.ts.map +0 -1
  270. package/dist/tools/suggest-stack.test.js +0 -181
  271. package/dist/tools/suggest-stack.test.js.map +0 -1
  272. package/dist/tools/suggest-tooling.test.d.ts +0 -2
  273. package/dist/tools/suggest-tooling.test.d.ts.map +0 -1
  274. package/dist/tools/suggest-tooling.test.js +0 -213
  275. package/dist/tools/suggest-tooling.test.js.map +0 -1
  276. package/dist/tools/summarize-spec.test.d.ts +0 -2
  277. package/dist/tools/summarize-spec.test.d.ts.map +0 -1
  278. package/dist/tools/summarize-spec.test.js +0 -180
  279. package/dist/tools/summarize-spec.test.js.map +0 -1
  280. package/dist/tools/update-status.test.d.ts +0 -2
  281. package/dist/tools/update-status.test.d.ts.map +0 -1
  282. package/dist/tools/update-status.test.js +0 -142
  283. package/dist/tools/update-status.test.js.map +0 -1
  284. package/dist/tools/validate.test.d.ts +0 -2
  285. package/dist/tools/validate.test.d.ts.map +0 -1
  286. package/dist/tools/validate.test.js +0 -137
  287. package/dist/tools/validate.test.js.map +0 -1
@@ -1,375 +0,0 @@
1
- // i18n/index.test.ts — Unit tests for the internationalization module
2
- import { describe, it, expect, beforeEach, vi } from 'vitest';
3
- // Mock readFileSync to control message loading
4
- vi.mock('node:fs', () => ({
5
- readFileSync: vi.fn(),
6
- }));
7
- import { readFileSync } from 'node:fs';
8
- const mockedReadFileSync = vi.mocked(readFileSync);
9
- // Sample message files
10
- const EN_MESSAGES = {
11
- spec: {
12
- created: 'Spec {id} created successfully',
13
- notFound: 'Spec {id} not found',
14
- },
15
- project: {
16
- initialized: 'Project initialized: {language} / {framework} detected',
17
- notFound: 'Project not found. Run init_project first',
18
- },
19
- locale: {
20
- changed: 'Locale changed to {locale}',
21
- },
22
- nested: {
23
- deep: {
24
- value: 'Deep nested value',
25
- },
26
- },
27
- arrayValue: [1, 2, 3],
28
- };
29
- const ES_MESSAGES = {
30
- spec: {
31
- created: 'Spec {id} creada exitosamente',
32
- notFound: 'Spec {id} no encontrada',
33
- },
34
- project: {
35
- initialized: 'Proyecto inicializado: {language} / {framework} detectado',
36
- },
37
- locale: {
38
- changed: 'Idioma cambiado a {locale}',
39
- },
40
- };
41
- const PT_MESSAGES = {
42
- spec: {
43
- created: 'Spec {id} criada com sucesso',
44
- },
45
- };
46
- let getLocale;
47
- let setLocale;
48
- let isSupportedLocale;
49
- let getSupportedLocales;
50
- let t;
51
- let ti;
52
- beforeEach(async () => {
53
- vi.resetModules();
54
- vi.resetAllMocks();
55
- // Mock readFileSync to return messages based on file path
56
- mockedReadFileSync.mockImplementation((pathArg) => {
57
- const path = String(pathArg);
58
- if (path.includes('en.json')) {
59
- return JSON.stringify(EN_MESSAGES);
60
- }
61
- if (path.includes('es.json')) {
62
- return JSON.stringify(ES_MESSAGES);
63
- }
64
- if (path.includes('pt.json')) {
65
- return JSON.stringify(PT_MESSAGES);
66
- }
67
- throw new Error('File not found');
68
- });
69
- // Re-import to reset module state (currentLocale, messageCache)
70
- const mod = await import('./index.js');
71
- getLocale = mod.getLocale;
72
- setLocale = mod.setLocale;
73
- isSupportedLocale = mod.isSupportedLocale;
74
- getSupportedLocales = mod.getSupportedLocales;
75
- t = mod.t;
76
- ti = mod.ti;
77
- });
78
- // =============================================================================
79
- // getLocale
80
- // =============================================================================
81
- describe('getLocale', () => {
82
- it('should return "en" as the default locale', () => {
83
- expect(getLocale()).toBe('en');
84
- });
85
- it('should return current locale after setLocale', () => {
86
- setLocale('es');
87
- expect(getLocale()).toBe('es');
88
- });
89
- });
90
- // =============================================================================
91
- // setLocale
92
- // =============================================================================
93
- describe('setLocale', () => {
94
- it('should change the locale to a supported value', () => {
95
- setLocale('es');
96
- expect(getLocale()).toBe('es');
97
- });
98
- it('should change locale to pt', () => {
99
- setLocale('pt');
100
- expect(getLocale()).toBe('pt');
101
- });
102
- it('should ignore invalid locale and keep current', () => {
103
- setLocale('es');
104
- setLocale('invalid');
105
- expect(getLocale()).toBe('es');
106
- });
107
- it('should allow setting back to en', () => {
108
- setLocale('es');
109
- setLocale('en');
110
- expect(getLocale()).toBe('en');
111
- });
112
- });
113
- // =============================================================================
114
- // isSupportedLocale
115
- // =============================================================================
116
- describe('isSupportedLocale', () => {
117
- it('should return true for "en"', () => {
118
- expect(isSupportedLocale('en')).toBe(true);
119
- });
120
- it('should return true for "es"', () => {
121
- expect(isSupportedLocale('es')).toBe(true);
122
- });
123
- it('should return true for "pt"', () => {
124
- expect(isSupportedLocale('pt')).toBe(true);
125
- });
126
- it('should return false for unsupported locale "fr"', () => {
127
- expect(isSupportedLocale('fr')).toBe(false);
128
- });
129
- it('should return false for empty string', () => {
130
- expect(isSupportedLocale('')).toBe(false);
131
- });
132
- it('should return false for "EN" (case-sensitive)', () => {
133
- expect(isSupportedLocale('EN')).toBe(false);
134
- });
135
- it('should return false for random strings', () => {
136
- expect(isSupportedLocale('xyz')).toBe(false);
137
- expect(isSupportedLocale('de')).toBe(false);
138
- expect(isSupportedLocale('ja')).toBe(false);
139
- });
140
- });
141
- // =============================================================================
142
- // getSupportedLocales
143
- // =============================================================================
144
- describe('getSupportedLocales', () => {
145
- it('should return all 3 supported locales', () => {
146
- const locales = getSupportedLocales();
147
- expect(locales).toHaveLength(3);
148
- expect(locales).toContain('en');
149
- expect(locales).toContain('es');
150
- expect(locales).toContain('pt');
151
- });
152
- it('should return a copy (not the internal array)', () => {
153
- const locales1 = getSupportedLocales();
154
- const locales2 = getSupportedLocales();
155
- expect(locales1).not.toBe(locales2);
156
- expect(locales1).toEqual(locales2);
157
- });
158
- });
159
- // =============================================================================
160
- // t (translate)
161
- // =============================================================================
162
- describe('t', () => {
163
- it('should return English translation for known key', () => {
164
- const result = t('spec.created');
165
- expect(result).toBe('Spec {id} created successfully');
166
- });
167
- it('should return Spanish translation when locale is es', () => {
168
- setLocale('es');
169
- const result = t('spec.created');
170
- expect(result).toBe('Spec {id} creada exitosamente');
171
- });
172
- it('should return Portuguese translation when locale is pt', () => {
173
- setLocale('pt');
174
- const result = t('spec.created');
175
- expect(result).toBe('Spec {id} criada com sucesso');
176
- });
177
- it('should fallback to English when key not found in current locale', () => {
178
- setLocale('pt');
179
- // pt does not have project.notFound
180
- const result = t('project.notFound');
181
- expect(result).toBe('Project not found. Run init_project first');
182
- });
183
- it('should fallback to English when es does not have the key', () => {
184
- setLocale('es');
185
- // es does not have nested.deep.value
186
- const result = t('nested.deep.value');
187
- expect(result).toBe('Deep nested value');
188
- });
189
- it('should return the key itself when not found in any locale', () => {
190
- const result = t('nonexistent.key.path');
191
- expect(result).toBe('nonexistent.key.path');
192
- });
193
- it('should return the key when not found in any locale even for non-en', () => {
194
- setLocale('es');
195
- const result = t('totally.unknown.key');
196
- expect(result).toBe('totally.unknown.key');
197
- });
198
- it('should accept locale override parameter', () => {
199
- // Current locale is en, but override to es
200
- const result = t('spec.created', 'es');
201
- expect(result).toBe('Spec {id} creada exitosamente');
202
- });
203
- it('should use override locale even when current is different', () => {
204
- setLocale('es');
205
- const result = t('spec.created', 'en');
206
- expect(result).toBe('Spec {id} created successfully');
207
- });
208
- it('should fallback to en when override locale does not have key', () => {
209
- const result = t('project.notFound', 'pt');
210
- expect(result).toBe('Project not found. Run init_project first');
211
- });
212
- it('should not fallback when current locale is en and key is missing', () => {
213
- const result = t('missing.key');
214
- // en is already the fallback, so returns the key
215
- expect(result).toBe('missing.key');
216
- });
217
- it('should handle deeply nested keys', () => {
218
- const result = t('nested.deep.value');
219
- expect(result).toBe('Deep nested value');
220
- });
221
- it('should stringify array values', () => {
222
- const result = t('arrayValue');
223
- expect(result).toBe('1,2,3');
224
- });
225
- it('should cache messages after first load', () => {
226
- t('spec.created');
227
- t('spec.notFound');
228
- // readFileSync should be called for en.json only once (messages dir check + locale load)
229
- // The exact count depends on the messagesDir detection but caching should prevent re-reads
230
- const enCalls = mockedReadFileSync.mock.calls.filter((call) => String(call[0]).includes('en.json'));
231
- // At most 2: one for messagesDir() check and one for loadMessages()
232
- expect(enCalls.length).toBeLessThanOrEqual(2);
233
- });
234
- });
235
- // =============================================================================
236
- // ti (translate with interpolation)
237
- // =============================================================================
238
- describe('ti', () => {
239
- it('should replace single placeholder', () => {
240
- const result = ti('spec.created', { id: 'SPEC-001' });
241
- expect(result).toBe('Spec SPEC-001 created successfully');
242
- });
243
- it('should replace multiple placeholders', () => {
244
- const result = ti('project.initialized', {
245
- language: 'TypeScript',
246
- framework: 'Next.js',
247
- });
248
- expect(result).toBe('Project initialized: TypeScript / Next.js detected');
249
- });
250
- it('should handle numeric values', () => {
251
- const result = ti('locale.changed', { locale: 'es' });
252
- expect(result).toBe('Locale changed to es');
253
- });
254
- it('should handle number type params', () => {
255
- // Use a key that has a placeholder and pass a number
256
- const result = ti('spec.created', { id: 42 });
257
- expect(result).toBe('Spec 42 created successfully');
258
- });
259
- it('should work with locale override', () => {
260
- const result = ti('spec.created', { id: 'SPEC-002' }, 'es');
261
- expect(result).toBe('Spec SPEC-002 creada exitosamente');
262
- });
263
- it('should fallback to en when interpolating missing locale key', () => {
264
- setLocale('pt');
265
- const result = ti('project.initialized', {
266
- language: 'Python',
267
- framework: 'Django',
268
- });
269
- // pt does not have project.initialized, falls back to en
270
- expect(result).toBe('Project initialized: Python / Django detected');
271
- });
272
- it('should return key with unreplaced placeholders for unknown keys', () => {
273
- const result = ti('unknown.key', { foo: 'bar' });
274
- expect(result).toBe('unknown.key');
275
- });
276
- it('should leave unreferenced placeholders unchanged', () => {
277
- const result = ti('spec.created', {});
278
- // No id param provided, so {id} stays
279
- expect(result).toBe('Spec {id} created successfully');
280
- });
281
- it('should replace all occurrences of a placeholder', () => {
282
- // spec.notFound only has {id} once, but let's test with a message that could have duplicates
283
- const result = ti('spec.notFound', { id: 'SPEC-X' });
284
- expect(result).toBe('Spec SPEC-X not found');
285
- });
286
- });
287
- // =============================================================================
288
- // Edge cases: file loading failures
289
- // =============================================================================
290
- describe('message loading failures', () => {
291
- it('should return empty messages when locale file fails to load', async () => {
292
- vi.resetModules();
293
- vi.resetAllMocks();
294
- mockedReadFileSync.mockImplementation(() => {
295
- throw new Error('File not found');
296
- });
297
- const mod = await import('./index.js');
298
- // All locales fail to load - should return the key itself
299
- const result = mod.t('spec.created');
300
- expect(result).toBe('spec.created');
301
- });
302
- it('should use distFallback path when srcPath fails', async () => {
303
- vi.resetModules();
304
- vi.resetAllMocks();
305
- let callCount = 0;
306
- mockedReadFileSync.mockImplementation((pathArg) => {
307
- const path = String(pathArg);
308
- callCount++;
309
- // First call is the messagesDir existence check - make it fail
310
- if (callCount === 1 && path.includes('messages')) {
311
- throw new Error('Not found in src');
312
- }
313
- // Subsequent calls (from dist fallback) should work
314
- if (path.includes('en.json')) {
315
- return JSON.stringify(EN_MESSAGES);
316
- }
317
- if (path.includes('es.json')) {
318
- return JSON.stringify(ES_MESSAGES);
319
- }
320
- throw new Error('File not found');
321
- });
322
- const mod = await import('./index.js');
323
- // This should still work because it falls back to the dist path
324
- const result = mod.t('spec.created');
325
- // Either the key (if fallback also failed) or the translation
326
- expect(typeof result).toBe('string');
327
- });
328
- it('should cache empty messages for failed locale', async () => {
329
- vi.resetModules();
330
- vi.resetAllMocks();
331
- mockedReadFileSync.mockImplementation((pathArg) => {
332
- const path = String(pathArg);
333
- if (path.includes('en.json')) {
334
- return JSON.stringify(EN_MESSAGES);
335
- }
336
- throw new Error('File not found');
337
- });
338
- const mod = await import('./index.js');
339
- mod.setLocale('es');
340
- // First call: loads (and fails), caches empty
341
- const r1 = mod.t('spec.created');
342
- // Should fall back to en
343
- expect(r1).toBe('Spec {id} created successfully');
344
- // Second call: uses cache
345
- const r2 = mod.t('spec.notFound');
346
- expect(r2).toBe('Spec {id} not found');
347
- });
348
- });
349
- // =============================================================================
350
- // Module state isolation
351
- // =============================================================================
352
- describe('module state', () => {
353
- it('should reset to en default when module re-imported', async () => {
354
- setLocale('es');
355
- expect(getLocale()).toBe('es');
356
- // Re-import resets the module
357
- vi.resetModules();
358
- mockedReadFileSync.mockImplementation((pathArg) => {
359
- const path = String(pathArg);
360
- if (path.includes('en.json')) {
361
- return JSON.stringify(EN_MESSAGES);
362
- }
363
- if (path.includes('es.json')) {
364
- return JSON.stringify(ES_MESSAGES);
365
- }
366
- if (path.includes('pt.json')) {
367
- return JSON.stringify(PT_MESSAGES);
368
- }
369
- throw new Error('File not found');
370
- });
371
- const freshMod = await import('./index.js');
372
- expect(freshMod.getLocale()).toBe('en');
373
- });
374
- });
375
- //# sourceMappingURL=index.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/i18n/index.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=index.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":""}
@@ -1,124 +0,0 @@
1
- // Tests for index.ts — MCP server entry point.
2
- import { describe, it, expect, vi, beforeEach } from 'vitest';
3
- // ---------------------------------------------------------------------------
4
- // Mock instances and constructor functions
5
- // ---------------------------------------------------------------------------
6
- const mockConnect = vi.fn().mockResolvedValue(undefined);
7
- const mockMcpServerInstance = { connect: mockConnect };
8
- // Use mockImplementation with a regular function so `new` works correctly.
9
- // Arrow functions cannot be constructors — Vitest requires `function` or `class`.
10
- const MockMcpServer = vi.fn().mockImplementation(function () {
11
- return mockMcpServerInstance;
12
- });
13
- const mockStdioTransportInstance = {};
14
- const MockStdioServerTransport = vi.fn().mockImplementation(function () {
15
- return mockStdioTransportInstance;
16
- });
17
- const mockRegisterResources = vi.fn();
18
- const mockRegisterSpecTools = vi.fn();
19
- const mockRegisterPlatformTools = vi.fn();
20
- // ---------------------------------------------------------------------------
21
- // Hoisted vi.mock calls — applied before any import
22
- // ---------------------------------------------------------------------------
23
- vi.mock('@modelcontextprotocol/sdk/server/mcp.js', () => ({
24
- McpServer: MockMcpServer,
25
- }));
26
- vi.mock('@modelcontextprotocol/sdk/server/stdio.js', () => ({
27
- StdioServerTransport: MockStdioServerTransport,
28
- }));
29
- vi.mock('./resources/registry.js', () => ({
30
- registerResources: mockRegisterResources,
31
- }));
32
- vi.mock('./tools/register-spec-tools.js', () => ({
33
- registerSpecTools: mockRegisterSpecTools,
34
- }));
35
- vi.mock('./tools/register-platform-tools.js', () => ({
36
- registerPlatformTools: mockRegisterPlatformTools,
37
- }));
38
- // ---------------------------------------------------------------------------
39
- // Helpers
40
- // ---------------------------------------------------------------------------
41
- /**
42
- * Reset modules and re-apply all doMock calls so the fresh dynamic import
43
- * of `./index.js` picks up the correct mocks.
44
- */
45
- function applyMocks(overrides) {
46
- vi.doMock('@modelcontextprotocol/sdk/server/mcp.js', () => ({
47
- McpServer: overrides?.McpServer ?? MockMcpServer,
48
- }));
49
- vi.doMock('@modelcontextprotocol/sdk/server/stdio.js', () => ({
50
- StdioServerTransport: MockStdioServerTransport,
51
- }));
52
- vi.doMock('./resources/registry.js', () => ({
53
- registerResources: mockRegisterResources,
54
- }));
55
- vi.doMock('./tools/register-spec-tools.js', () => ({
56
- registerSpecTools: mockRegisterSpecTools,
57
- }));
58
- vi.doMock('./tools/register-platform-tools.js', () => ({
59
- registerPlatformTools: mockRegisterPlatformTools,
60
- }));
61
- }
62
- // ---------------------------------------------------------------------------
63
- // Tests
64
- // ---------------------------------------------------------------------------
65
- describe('index.ts — MCP server entry point', () => {
66
- beforeEach(() => {
67
- vi.clearAllMocks();
68
- vi.resetModules();
69
- });
70
- it('should create an McpServer with name and version', async () => {
71
- applyMocks();
72
- await import('./index.js');
73
- expect(MockMcpServer).toHaveBeenCalledWith({
74
- name: 'specforge',
75
- version: '0.1.0',
76
- });
77
- });
78
- it('should call registerResources with the server instance', async () => {
79
- applyMocks();
80
- await import('./index.js');
81
- expect(mockRegisterResources).toHaveBeenCalledWith(mockMcpServerInstance);
82
- });
83
- it('should call registerSpecTools with the server instance', async () => {
84
- applyMocks();
85
- await import('./index.js');
86
- expect(mockRegisterSpecTools).toHaveBeenCalledWith(mockMcpServerInstance);
87
- });
88
- it('should call registerPlatformTools with the server instance', async () => {
89
- applyMocks();
90
- await import('./index.js');
91
- expect(mockRegisterPlatformTools).toHaveBeenCalledWith(mockMcpServerInstance);
92
- });
93
- it('should create a StdioServerTransport and connect it', async () => {
94
- applyMocks();
95
- await import('./index.js');
96
- // Allow microtasks to settle (main() is async)
97
- await new Promise((resolve) => setTimeout(resolve, 50));
98
- expect(MockStdioServerTransport).toHaveBeenCalled();
99
- expect(mockConnect).toHaveBeenCalledWith(mockStdioTransportInstance);
100
- });
101
- it('should log error and exit on main() failure', async () => {
102
- const connectError = new Error('Transport failed');
103
- const failConnect = vi.fn().mockRejectedValue(connectError);
104
- const failServerInstance = { connect: failConnect };
105
- const FailMcpServer = vi.fn().mockImplementation(function () {
106
- return failServerInstance;
107
- });
108
- applyMocks({ McpServer: FailMcpServer });
109
- const consoleErrorSpy = vi
110
- .spyOn(console, 'error')
111
- .mockImplementation(() => undefined);
112
- const processExitSpy = vi
113
- .spyOn(process, 'exit')
114
- .mockImplementation(() => undefined);
115
- await import('./index.js');
116
- // Allow the .catch handler to fire
117
- await new Promise((resolve) => setTimeout(resolve, 100));
118
- expect(consoleErrorSpy).toHaveBeenCalledWith('SpecForge MCP Server failed to start:', connectError);
119
- expect(processExitSpy).toHaveBeenCalledWith(1);
120
- consoleErrorSpy.mockRestore();
121
- processExitSpy.mockRestore();
122
- });
123
- });
124
- //# sourceMappingURL=index.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=patterns.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"patterns.test.d.ts","sourceRoot":"","sources":["../../src/resources/patterns.test.ts"],"names":[],"mappings":""}