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,142 +0,0 @@
1
- // Tests for handlePatternsResource
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 { handlePatternsResource, patternsResourceDefinition } from './patterns.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('handlePatternsResource', () => {
18
- it('should return empty list when no pattern files found', async () => {
19
- mockGlob.mockResolvedValue([]);
20
- const result = await handlePatternsResource();
21
- const parsed = JSON.parse(result);
22
- expect(parsed.count).toBe(0);
23
- expect(parsed.patterns).toEqual([]);
24
- expect(parsed.byType).toEqual({});
25
- expect(parsed.message).toBe('resources.patterns.notFound');
26
- });
27
- it('should return empty list when glob throws', async () => {
28
- mockGlob.mockRejectedValue(new Error('ENOENT'));
29
- const result = await handlePatternsResource();
30
- const parsed = JSON.parse(result);
31
- expect(parsed.count).toBe(0);
32
- expect(parsed.patterns).toEqual([]);
33
- });
34
- it('should load patterns from multiple projects', async () => {
35
- mockGlob.mockResolvedValue([
36
- 'data/projects/p1/patterns.json',
37
- 'data/projects/p2/patterns.json',
38
- ]);
39
- let callIdx = 0;
40
- mockReadFile.mockImplementation(() => {
41
- callIdx++;
42
- if (callIdx === 1) {
43
- return Promise.resolve(JSON.stringify([
44
- { id: 'PAT-001', type: 'naming', pattern: 'camelCase', source: 'detected', confidence: 0.9, usageCount: 10, learnedAt: '2025-01-01' },
45
- ]));
46
- }
47
- return Promise.resolve(JSON.stringify([
48
- { id: 'PAT-002', type: 'architecture', pattern: 'layered', source: 'manual', confidence: 1.0, usageCount: 5, learnedAt: '2025-01-02' },
49
- { id: 'PAT-003', type: 'naming', pattern: 'kebab-case files', source: 'detected', confidence: 0.8, usageCount: 20, learnedAt: '2025-01-03' },
50
- ]));
51
- });
52
- const result = await handlePatternsResource();
53
- const parsed = JSON.parse(result);
54
- expect(parsed.count).toBe(3);
55
- expect(parsed.patterns).toHaveLength(3);
56
- expect(parsed.byType.naming).toBe(2);
57
- expect(parsed.byType.architecture).toBe(1);
58
- });
59
- it('should include summary fields for each pattern', async () => {
60
- mockGlob.mockResolvedValue(['data/projects/p1/patterns.json']);
61
- mockReadFile.mockResolvedValue(JSON.stringify([
62
- { id: 'PAT-001', type: 'testing', pattern: 'describe/it blocks', source: 'detected', confidence: 0.95, usageCount: 50, learnedAt: '2025-01-01', extraField: 'ignored' },
63
- ]));
64
- const result = await handlePatternsResource();
65
- const parsed = JSON.parse(result);
66
- expect(parsed.patterns[0].id).toBe('PAT-001');
67
- expect(parsed.patterns[0].type).toBe('testing');
68
- expect(parsed.patterns[0].pattern).toBe('describe/it blocks');
69
- expect(parsed.patterns[0].source).toBe('detected');
70
- expect(parsed.patterns[0].confidence).toBe(0.95);
71
- expect(parsed.patterns[0].usageCount).toBe(50);
72
- expect(parsed.patterns[0].learnedAt).toBe('2025-01-01');
73
- });
74
- it('should skip malformed pattern files', async () => {
75
- mockGlob.mockResolvedValue([
76
- 'data/projects/p1/patterns.json',
77
- 'data/projects/p2/patterns.json',
78
- ]);
79
- let callIdx = 0;
80
- mockReadFile.mockImplementation(() => {
81
- callIdx++;
82
- if (callIdx === 1) {
83
- return Promise.resolve(JSON.stringify([
84
- { id: 'PAT-001', type: 'naming', pattern: 'ok', source: 'detected', confidence: 0.9, usageCount: 1, learnedAt: '2025-01-01' },
85
- ]));
86
- }
87
- return Promise.resolve('not json at all!!!{');
88
- });
89
- const result = await handlePatternsResource();
90
- const parsed = JSON.parse(result);
91
- expect(parsed.count).toBe(1);
92
- expect(parsed.patterns).toHaveLength(1);
93
- });
94
- it('should skip non-array pattern files', async () => {
95
- mockGlob.mockResolvedValue([
96
- 'data/projects/p1/patterns.json',
97
- 'data/projects/p2/patterns.json',
98
- ]);
99
- let callIdx = 0;
100
- mockReadFile.mockImplementation(() => {
101
- callIdx++;
102
- if (callIdx === 1) {
103
- return Promise.resolve(JSON.stringify([
104
- { id: 'PAT-001', type: 'naming', pattern: 'good', source: 'detected', confidence: 0.9, usageCount: 1, learnedAt: '2025-01-01' },
105
- ]));
106
- }
107
- // Return an object instead of array
108
- return Promise.resolve(JSON.stringify({ id: 'PAT-002', type: 'bad' }));
109
- });
110
- const result = await handlePatternsResource();
111
- const parsed = JSON.parse(result);
112
- // Only the array-based file should be loaded
113
- expect(parsed.count).toBe(1);
114
- expect(parsed.patterns[0].id).toBe('PAT-001');
115
- });
116
- it('should skip files that fail to read', async () => {
117
- mockGlob.mockResolvedValue([
118
- 'data/projects/p1/patterns.json',
119
- 'data/projects/p2/patterns.json',
120
- ]);
121
- let callIdx = 0;
122
- mockReadFile.mockImplementation(() => {
123
- callIdx++;
124
- if (callIdx === 1) {
125
- return Promise.resolve(JSON.stringify([
126
- { id: 'PAT-001', type: 'naming', pattern: 'ok', source: 'detected', confidence: 0.9, usageCount: 1, learnedAt: '2025-01-01' },
127
- ]));
128
- }
129
- return Promise.reject(new Error('Permission denied'));
130
- });
131
- const result = await handlePatternsResource();
132
- const parsed = JSON.parse(result);
133
- expect(parsed.count).toBe(1);
134
- });
135
- it('should export resource definition', () => {
136
- expect(patternsResourceDefinition.uri).toBe('specforge://patterns');
137
- expect(patternsResourceDefinition.name).toBe('Learned Patterns');
138
- expect(patternsResourceDefinition.mimeType).toBe('application/json');
139
- expect(patternsResourceDefinition.description).toBe('resources.patterns.description');
140
- });
141
- });
142
- //# sourceMappingURL=patterns.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"patterns.test.js","sourceRoot":"","sources":["../../src/resources/patterns.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=process.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"process.test.d.ts","sourceRoot":"","sources":["../../src/resources/process.test.ts"],"names":[],"mappings":""}
@@ -1,48 +0,0 @@
1
- // Tests for handleProcessResource
2
- import { describe, it, expect, vi } from 'vitest';
3
- vi.mock('../i18n/index.js', () => ({
4
- t: (key) => key,
5
- }));
6
- import { handleProcessResource, processResourceDefinition } from './process.js';
7
- describe('handleProcessResource', () => {
8
- it('should return valid JSON string', async () => {
9
- const result = await handleProcessResource();
10
- const parsed = JSON.parse(result);
11
- expect(parsed).toBeDefined();
12
- expect(parsed.name).toContain('SDD');
13
- expect(parsed.version).toBe('1.0');
14
- });
15
- it('should include all SDD phases', async () => {
16
- const result = await handleProcessResource();
17
- const parsed = JSON.parse(result);
18
- expect(parsed.phases).toBeDefined();
19
- expect(parsed.phases.length).toBe(8);
20
- });
21
- it('should include spec lifecycle', async () => {
22
- const result = await handleProcessResource();
23
- const parsed = JSON.parse(result);
24
- expect(parsed.specLifecycle).toEqual(['draft', 'review', 'approved', 'implementing', 'done']);
25
- });
26
- it('should include total tools count', async () => {
27
- const result = await handleProcessResource();
28
- const parsed = JSON.parse(result);
29
- expect(parsed.totalTools).toBe(37);
30
- });
31
- it('should have each phase with tools array', async () => {
32
- const result = await handleProcessResource();
33
- const parsed = JSON.parse(result);
34
- for (const phase of parsed.phases) {
35
- expect(phase.id).toBeDefined();
36
- expect(phase.name).toBeDefined();
37
- expect(phase.tools).toBeDefined();
38
- expect(Array.isArray(phase.tools)).toBe(true);
39
- expect(phase.description).toBeDefined();
40
- }
41
- });
42
- it('should export resource definition', () => {
43
- expect(processResourceDefinition.uri).toBe('specforge://process');
44
- expect(processResourceDefinition.name).toBe('SDD Process');
45
- expect(processResourceDefinition.mimeType).toBe('application/json');
46
- });
47
- });
48
- //# sourceMappingURL=process.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"process.test.js","sourceRoot":"","sources":["../../src/resources/process.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=registry.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.test.d.ts","sourceRoot":"","sources":["../../src/resources/registry.test.ts"],"names":[],"mappings":""}
@@ -1,138 +0,0 @@
1
- // Tests for registerResources
2
- import { describe, it, expect, vi } from 'vitest';
3
- vi.mock('../i18n/index.js', () => ({
4
- t: (key) => key,
5
- }));
6
- vi.mock('./process.js', () => ({
7
- handleProcessResource: vi.fn().mockResolvedValue('{"process":"data"}'),
8
- processResourceDefinition: {
9
- uri: 'specforge://process',
10
- name: 'SDD Process',
11
- description: 'Process description',
12
- mimeType: 'application/json',
13
- },
14
- }));
15
- vi.mock('./specs.js', () => ({
16
- handleSpecsResource: vi.fn().mockResolvedValue('{"specs":"data"}'),
17
- specsResourceDefinition: {
18
- uri: 'specforge://specs',
19
- name: 'Project Specs',
20
- description: 'Specs description',
21
- mimeType: 'application/json',
22
- },
23
- }));
24
- vi.mock('./templates.js', () => ({
25
- handleTemplatesResource: vi.fn().mockResolvedValue('{"templates":"data"}'),
26
- templatesResourceDefinition: {
27
- uri: 'specforge://templates',
28
- name: 'Spec Templates',
29
- description: 'Templates description',
30
- mimeType: 'application/json',
31
- },
32
- }));
33
- vi.mock('./patterns.js', () => ({
34
- handlePatternsResource: vi.fn().mockResolvedValue('{"patterns":"data"}'),
35
- patternsResourceDefinition: {
36
- uri: 'specforge://patterns',
37
- name: 'Learned Patterns',
38
- description: 'Patterns description',
39
- mimeType: 'application/json',
40
- },
41
- }));
42
- import { registerResources } from './registry.js';
43
- function createMockServer() {
44
- return {
45
- registerResource: vi.fn(),
46
- };
47
- }
48
- describe('registerResources', () => {
49
- it('should register exactly 4 resources', () => {
50
- const server = createMockServer();
51
- registerResources(server);
52
- expect(server.registerResource).toHaveBeenCalledTimes(4);
53
- });
54
- it('should register the process resource', () => {
55
- const server = createMockServer();
56
- registerResources(server);
57
- const processCall = server.registerResource.mock.calls.find((call) => call[0] === 'SDD Process');
58
- expect(processCall).toBeDefined();
59
- expect(processCall[1]).toBe('specforge://process');
60
- expect(processCall[2].mimeType).toBe('application/json');
61
- });
62
- it('should register the specs resource', () => {
63
- const server = createMockServer();
64
- registerResources(server);
65
- const specsCall = server.registerResource.mock.calls.find((call) => call[0] === 'Project Specs');
66
- expect(specsCall).toBeDefined();
67
- expect(specsCall[1]).toBe('specforge://specs');
68
- expect(specsCall[2].mimeType).toBe('application/json');
69
- });
70
- it('should register the templates resource', () => {
71
- const server = createMockServer();
72
- registerResources(server);
73
- const templatesCall = server.registerResource.mock.calls.find((call) => call[0] === 'Spec Templates');
74
- expect(templatesCall).toBeDefined();
75
- expect(templatesCall[1]).toBe('specforge://templates');
76
- expect(templatesCall[2].mimeType).toBe('application/json');
77
- });
78
- it('should register the patterns resource', () => {
79
- const server = createMockServer();
80
- registerResources(server);
81
- const patternsCall = server.registerResource.mock.calls.find((call) => call[0] === 'Learned Patterns');
82
- expect(patternsCall).toBeDefined();
83
- expect(patternsCall[1]).toBe('specforge://patterns');
84
- expect(patternsCall[2].mimeType).toBe('application/json');
85
- });
86
- it('should pass async handler functions for each resource', () => {
87
- const server = createMockServer();
88
- registerResources(server);
89
- // Each call should have a handler function as the 4th argument
90
- for (const call of server.registerResource.mock.calls) {
91
- expect(typeof call[3]).toBe('function');
92
- }
93
- });
94
- it('should return correct content from process handler', async () => {
95
- const server = createMockServer();
96
- registerResources(server);
97
- const processCall = server.registerResource.mock.calls.find((call) => call[0] === 'SDD Process');
98
- const handler = processCall[3];
99
- const mockUri = { href: 'specforge://process' };
100
- const result = await handler(mockUri);
101
- expect(result.contents).toHaveLength(1);
102
- expect(result.contents[0].uri).toBe('specforge://process');
103
- expect(result.contents[0].mimeType).toBe('application/json');
104
- expect(result.contents[0].text).toBe('{"process":"data"}');
105
- });
106
- it('should return correct content from specs handler', async () => {
107
- const server = createMockServer();
108
- registerResources(server);
109
- const specsCall = server.registerResource.mock.calls.find((call) => call[0] === 'Project Specs');
110
- const handler = specsCall[3];
111
- const mockUri = { href: 'specforge://specs' };
112
- const result = await handler(mockUri);
113
- expect(result.contents).toHaveLength(1);
114
- expect(result.contents[0].uri).toBe('specforge://specs');
115
- expect(result.contents[0].text).toBe('{"specs":"data"}');
116
- });
117
- it('should return correct content from templates handler', async () => {
118
- const server = createMockServer();
119
- registerResources(server);
120
- const templatesCall = server.registerResource.mock.calls.find((call) => call[0] === 'Spec Templates');
121
- const handler = templatesCall[3];
122
- const mockUri = { href: 'specforge://templates' };
123
- const result = await handler(mockUri);
124
- expect(result.contents).toHaveLength(1);
125
- expect(result.contents[0].text).toBe('{"templates":"data"}');
126
- });
127
- it('should return correct content from patterns handler', async () => {
128
- const server = createMockServer();
129
- registerResources(server);
130
- const patternsCall = server.registerResource.mock.calls.find((call) => call[0] === 'Learned Patterns');
131
- const handler = patternsCall[3];
132
- const mockUri = { href: 'specforge://patterns' };
133
- const result = await handler(mockUri);
134
- expect(result.contents).toHaveLength(1);
135
- expect(result.contents[0].text).toBe('{"patterns":"data"}');
136
- });
137
- });
138
- //# sourceMappingURL=registry.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.test.js","sourceRoot":"","sources":["../../src/resources/registry.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=specs.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"specs.test.d.ts","sourceRoot":"","sources":["../../src/resources/specs.test.ts"],"names":[],"mappings":""}
@@ -1,130 +0,0 @@
1
- // Tests for handleSpecsResource
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 { handleSpecsResource, specsResourceDefinition } from './specs.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('handleSpecsResource', () => {
18
- it('should return empty list when no spec files found', async () => {
19
- mockGlob.mockResolvedValue([]);
20
- const result = await handleSpecsResource();
21
- const parsed = JSON.parse(result);
22
- expect(parsed.count).toBe(0);
23
- expect(parsed.specs).toEqual([]);
24
- expect(parsed.message).toBe('resources.specs.notFound');
25
- });
26
- it('should return empty list when glob throws', async () => {
27
- mockGlob.mockRejectedValue(new Error('ENOENT'));
28
- const result = await handleSpecsResource();
29
- const parsed = JSON.parse(result);
30
- expect(parsed.count).toBe(0);
31
- expect(parsed.specs).toEqual([]);
32
- });
33
- it('should return specs with summary fields', async () => {
34
- mockGlob.mockResolvedValue(['data/projects/p1/specs/SPEC-001.json']);
35
- mockReadFile.mockResolvedValue(JSON.stringify({
36
- id: 'SPEC-001',
37
- title: 'User Auth',
38
- type: 'feature',
39
- scope: 'feature',
40
- status: 'approved',
41
- difficulty: 3,
42
- risk: 'medium',
43
- target: 'backend',
44
- createdAt: '2025-01-01',
45
- updatedAt: '2025-01-02',
46
- }));
47
- const result = await handleSpecsResource();
48
- const parsed = JSON.parse(result);
49
- expect(parsed.count).toBe(1);
50
- expect(parsed.specs).toHaveLength(1);
51
- expect(parsed.specs[0].id).toBe('SPEC-001');
52
- expect(parsed.specs[0].title).toBe('User Auth');
53
- expect(parsed.specs[0].type).toBe('feature');
54
- expect(parsed.specs[0].status).toBe('approved');
55
- expect(parsed.byStatus).toEqual({ approved: 1 });
56
- });
57
- it('should aggregate byStatus counts across multiple specs', async () => {
58
- mockGlob.mockResolvedValue([
59
- 'data/projects/p1/specs/SPEC-001.json',
60
- 'data/projects/p1/specs/SPEC-002.json',
61
- 'data/projects/p2/specs/SPEC-003.json',
62
- ]);
63
- const specs = [
64
- { id: 'SPEC-001', title: 'A', type: 'feature', scope: 'feature', status: 'approved', difficulty: 1, risk: 'low', target: 'backend', createdAt: '2025-01-01', updatedAt: '2025-01-01' },
65
- { id: 'SPEC-002', title: 'B', type: 'bugfix', scope: 'trivial', status: 'approved', difficulty: 2, risk: 'low', target: 'frontend', createdAt: '2025-01-01', updatedAt: '2025-01-01' },
66
- { id: 'SPEC-003', title: 'C', type: 'refactor', scope: 'feature', status: 'implementing', difficulty: 3, risk: 'medium', target: 'fullstack', createdAt: '2025-01-01', updatedAt: '2025-01-01' },
67
- ];
68
- let callIdx = 0;
69
- mockReadFile.mockImplementation(() => {
70
- return Promise.resolve(JSON.stringify(specs[callIdx++]));
71
- });
72
- const result = await handleSpecsResource();
73
- const parsed = JSON.parse(result);
74
- expect(parsed.count).toBe(3);
75
- expect(parsed.byStatus.approved).toBe(2);
76
- expect(parsed.byStatus.implementing).toBe(1);
77
- expect(parsed.specs).toHaveLength(3);
78
- });
79
- it('should skip malformed JSON files', async () => {
80
- mockGlob.mockResolvedValue([
81
- 'data/projects/p1/specs/good.json',
82
- 'data/projects/p1/specs/bad.json',
83
- ]);
84
- let callIdx = 0;
85
- mockReadFile.mockImplementation(() => {
86
- callIdx++;
87
- if (callIdx === 1) {
88
- return Promise.resolve(JSON.stringify({
89
- id: 'SPEC-001', title: 'Good', type: 'feature', scope: 'feature',
90
- status: 'draft', difficulty: 1, risk: 'low', target: 'backend',
91
- createdAt: '2025-01-01', updatedAt: '2025-01-01',
92
- }));
93
- }
94
- return Promise.resolve('not valid json{{{');
95
- });
96
- const result = await handleSpecsResource();
97
- const parsed = JSON.parse(result);
98
- expect(parsed.count).toBe(1);
99
- expect(parsed.specs[0].id).toBe('SPEC-001');
100
- });
101
- it('should skip files that fail to read', async () => {
102
- mockGlob.mockResolvedValue([
103
- 'data/projects/p1/specs/ok.json',
104
- 'data/projects/p1/specs/unreadable.json',
105
- ]);
106
- let callIdx = 0;
107
- mockReadFile.mockImplementation(() => {
108
- callIdx++;
109
- if (callIdx === 1) {
110
- return Promise.resolve(JSON.stringify({
111
- id: 'SPEC-001', title: 'OK', type: 'feature', scope: 'feature',
112
- status: 'review', difficulty: 2, risk: 'low', target: 'backend',
113
- createdAt: '2025-01-01', updatedAt: '2025-01-01',
114
- }));
115
- }
116
- return Promise.reject(new Error('Permission denied'));
117
- });
118
- const result = await handleSpecsResource();
119
- const parsed = JSON.parse(result);
120
- expect(parsed.count).toBe(1);
121
- expect(parsed.specs[0].id).toBe('SPEC-001');
122
- });
123
- it('should export resource definition', () => {
124
- expect(specsResourceDefinition.uri).toBe('specforge://specs');
125
- expect(specsResourceDefinition.name).toBe('Project Specs');
126
- expect(specsResourceDefinition.mimeType).toBe('application/json');
127
- expect(specsResourceDefinition.description).toBe('resources.specs.description');
128
- });
129
- });
130
- //# sourceMappingURL=specs.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"specs.test.js","sourceRoot":"","sources":["../../src/resources/specs.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=templates.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"templates.test.d.ts","sourceRoot":"","sources":["../../src/resources/templates.test.ts"],"names":[],"mappings":""}