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,224 +0,0 @@
1
- // pattern-store.test.ts — Unit tests for learned pattern CRUD operations
2
- import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
3
- import { mkdtemp, rm } from 'node:fs/promises';
4
- import { join } from 'node:path';
5
- import { tmpdir } from 'node:os';
6
- // Mock projectDataDir to use a temp directory for isolation
7
- let tempDir;
8
- vi.mock('./base-store.js', async (importOriginal) => {
9
- const original = await importOriginal();
10
- return {
11
- ...original,
12
- readJson: vi.fn(original.readJson),
13
- projectDataDir: (projectId) => join(tempDir, 'projects', projectId),
14
- };
15
- });
16
- const baseStore = await import('./base-store.js');
17
- const mockReadJson = vi.mocked(baseStore.readJson);
18
- const { listPatterns, getPattern, addPattern, updatePattern, incrementPatternUsage, deletePattern, findPatternsByType, findPatterns, clearPatterns, } = await import('./pattern-store.js');
19
- const PROJECT_ID = 'pattern-test-proj';
20
- function makePattern(overrides = {}) {
21
- return {
22
- id: 'pattern-001',
23
- projectId: PROJECT_ID,
24
- type: 'architecture',
25
- pattern: 'Service classes should not call repositories directly',
26
- source: 'code-review',
27
- learnedAt: '2026-01-01T00:00:00.000Z',
28
- confidence: 0.85,
29
- usageCount: 0,
30
- ...overrides,
31
- };
32
- }
33
- describe('pattern-store', () => {
34
- beforeEach(async () => {
35
- tempDir = await mkdtemp(join(tmpdir(), 'sdd-pattern-store-test-'));
36
- });
37
- afterEach(async () => {
38
- await rm(tempDir, { recursive: true, force: true });
39
- vi.restoreAllMocks();
40
- });
41
- describe('listPatterns', () => {
42
- it('should return an empty array for a new project', async () => {
43
- const result = await listPatterns(PROJECT_ID);
44
- expect(result).toEqual([]);
45
- });
46
- it('should return all added patterns', async () => {
47
- await addPattern(PROJECT_ID, makePattern({ id: 'pattern-001' }));
48
- await addPattern(PROJECT_ID, makePattern({ id: 'pattern-002' }));
49
- const result = await listPatterns(PROJECT_ID);
50
- expect(result).toHaveLength(2);
51
- });
52
- });
53
- describe('addPattern', () => {
54
- it('should add a new pattern and return it', async () => {
55
- const pattern = makePattern();
56
- const result = await addPattern(PROJECT_ID, pattern);
57
- expect(result).toEqual(pattern);
58
- expect(result.id).toBe('pattern-001');
59
- });
60
- it('should replace an existing pattern with the same id', async () => {
61
- await addPattern(PROJECT_ID, makePattern({ confidence: 0.5 }));
62
- await addPattern(PROJECT_ID, makePattern({ confidence: 0.95 }));
63
- const all = await listPatterns(PROJECT_ID);
64
- expect(all).toHaveLength(1);
65
- expect(all[0]?.confidence).toBe(0.95);
66
- });
67
- it('should add multiple patterns with different ids', async () => {
68
- await addPattern(PROJECT_ID, makePattern({ id: 'p-1', type: 'architecture' }));
69
- await addPattern(PROJECT_ID, makePattern({ id: 'p-2', type: 'convention' }));
70
- await addPattern(PROJECT_ID, makePattern({ id: 'p-3', type: 'quality' }));
71
- const all = await listPatterns(PROJECT_ID);
72
- expect(all).toHaveLength(3);
73
- });
74
- });
75
- describe('getPattern', () => {
76
- it('should return null when pattern does not exist', async () => {
77
- const result = await getPattern(PROJECT_ID, 'nonexistent');
78
- expect(result).toBeNull();
79
- });
80
- it('should retrieve a previously added pattern', async () => {
81
- const pattern = makePattern();
82
- await addPattern(PROJECT_ID, pattern);
83
- const result = await getPattern(PROJECT_ID, 'pattern-001');
84
- expect(result).toEqual(pattern);
85
- });
86
- });
87
- describe('updatePattern', () => {
88
- it('should update an existing pattern with partial data', async () => {
89
- await addPattern(PROJECT_ID, makePattern());
90
- const result = await updatePattern(PROJECT_ID, 'pattern-001', {
91
- confidence: 0.99,
92
- pattern: 'Updated pattern description',
93
- });
94
- expect(result.confidence).toBe(0.99);
95
- expect(result.pattern).toBe('Updated pattern description');
96
- expect(result.id).toBe('pattern-001');
97
- });
98
- it('should throw when updating a non-existent pattern', async () => {
99
- await expect(updatePattern(PROJECT_ID, 'nonexistent', { confidence: 0.5 })).rejects.toThrow('Pattern "nonexistent" not found');
100
- });
101
- it('should never allow id override through updates', async () => {
102
- await addPattern(PROJECT_ID, makePattern());
103
- const result = await updatePattern(PROJECT_ID, 'pattern-001', {
104
- id: 'tampered-id',
105
- });
106
- expect(result.id).toBe('pattern-001');
107
- });
108
- it('should persist updates to disk', async () => {
109
- await addPattern(PROJECT_ID, makePattern());
110
- await updatePattern(PROJECT_ID, 'pattern-001', { confidence: 0.42 });
111
- const fetched = await getPattern(PROJECT_ID, 'pattern-001');
112
- expect(fetched?.confidence).toBe(0.42);
113
- });
114
- });
115
- describe('incrementPatternUsage', () => {
116
- it('should increment usage count by 1', async () => {
117
- await addPattern(PROJECT_ID, makePattern({ usageCount: 0 }));
118
- const result = await incrementPatternUsage(PROJECT_ID, 'pattern-001');
119
- expect(result.usageCount).toBe(1);
120
- });
121
- it('should increment usage count multiple times', async () => {
122
- await addPattern(PROJECT_ID, makePattern({ usageCount: 5 }));
123
- await incrementPatternUsage(PROJECT_ID, 'pattern-001');
124
- await incrementPatternUsage(PROJECT_ID, 'pattern-001');
125
- const result = await incrementPatternUsage(PROJECT_ID, 'pattern-001');
126
- expect(result.usageCount).toBe(8);
127
- });
128
- it('should throw when pattern does not exist', async () => {
129
- await expect(incrementPatternUsage(PROJECT_ID, 'nonexistent')).rejects.toThrow('Pattern "nonexistent" not found');
130
- });
131
- it('should persist the incremented count to disk', async () => {
132
- await addPattern(PROJECT_ID, makePattern({ usageCount: 0 }));
133
- await incrementPatternUsage(PROJECT_ID, 'pattern-001');
134
- const fetched = await getPattern(PROJECT_ID, 'pattern-001');
135
- expect(fetched?.usageCount).toBe(1);
136
- });
137
- });
138
- describe('deletePattern', () => {
139
- it('should return true when deleting an existing pattern', async () => {
140
- await addPattern(PROJECT_ID, makePattern());
141
- const result = await deletePattern(PROJECT_ID, 'pattern-001');
142
- expect(result).toBe(true);
143
- const fetched = await getPattern(PROJECT_ID, 'pattern-001');
144
- expect(fetched).toBeNull();
145
- });
146
- it('should return false when deleting a non-existent pattern', async () => {
147
- const result = await deletePattern(PROJECT_ID, 'nonexistent');
148
- expect(result).toBe(false);
149
- });
150
- it('should not affect other patterns when deleting one', async () => {
151
- await addPattern(PROJECT_ID, makePattern({ id: 'p-1' }));
152
- await addPattern(PROJECT_ID, makePattern({ id: 'p-2' }));
153
- await addPattern(PROJECT_ID, makePattern({ id: 'p-3' }));
154
- await deletePattern(PROJECT_ID, 'p-2');
155
- const remaining = await listPatterns(PROJECT_ID);
156
- expect(remaining).toHaveLength(2);
157
- expect(remaining.map((p) => p.id)).toEqual(['p-1', 'p-3']);
158
- });
159
- });
160
- describe('findPatternsByType', () => {
161
- it('should filter patterns by type', async () => {
162
- await addPattern(PROJECT_ID, makePattern({ id: 'p-1', type: 'architecture' }));
163
- await addPattern(PROJECT_ID, makePattern({ id: 'p-2', type: 'convention' }));
164
- await addPattern(PROJECT_ID, makePattern({ id: 'p-3', type: 'architecture' }));
165
- await addPattern(PROJECT_ID, makePattern({ id: 'p-4', type: 'quality' }));
166
- const archPatterns = await findPatternsByType(PROJECT_ID, 'architecture');
167
- expect(archPatterns).toHaveLength(2);
168
- const convPatterns = await findPatternsByType(PROJECT_ID, 'convention');
169
- expect(convPatterns).toHaveLength(1);
170
- });
171
- it('should return an empty array when no patterns match', async () => {
172
- await addPattern(PROJECT_ID, makePattern({ type: 'architecture' }));
173
- const result = await findPatternsByType(PROJECT_ID, 'estimation');
174
- expect(result).toEqual([]);
175
- });
176
- });
177
- describe('findPatterns', () => {
178
- it('should filter patterns by custom predicate', async () => {
179
- await addPattern(PROJECT_ID, makePattern({ id: 'p-1', confidence: 0.3 }));
180
- await addPattern(PROJECT_ID, makePattern({ id: 'p-2', confidence: 0.8 }));
181
- await addPattern(PROJECT_ID, makePattern({ id: 'p-3', confidence: 0.95 }));
182
- const highConfidence = await findPatterns(PROJECT_ID, (p) => p.confidence > 0.7);
183
- expect(highConfidence).toHaveLength(2);
184
- });
185
- });
186
- describe('clearPatterns', () => {
187
- it('should remove all patterns for a project', async () => {
188
- await addPattern(PROJECT_ID, makePattern({ id: 'p-1' }));
189
- await addPattern(PROJECT_ID, makePattern({ id: 'p-2' }));
190
- await clearPatterns(PROJECT_ID);
191
- const result = await listPatterns(PROJECT_ID);
192
- expect(result).toEqual([]);
193
- });
194
- it('should be safe to call on an empty project', async () => {
195
- await clearPatterns(PROJECT_ID);
196
- const result = await listPatterns(PROJECT_ID);
197
- expect(result).toEqual([]);
198
- });
199
- });
200
- describe('defensive guards for noUncheckedIndexedAccess', () => {
201
- function makeSparseArray() {
202
- return new Proxy([], {
203
- get(target, prop) {
204
- if (prop === 'findIndex') {
205
- return () => 0;
206
- }
207
- return Reflect.get(target, prop);
208
- },
209
- });
210
- }
211
- it('should throw in updatePattern when indexed access returns undefined', async () => {
212
- mockReadJson.mockResolvedValueOnce(makeSparseArray());
213
- await expect(updatePattern(PROJECT_ID, 'any-id', { confidence: 0.5 })).rejects.toThrow('Pattern "any-id" not found');
214
- // Restore real implementation for subsequent tests
215
- mockReadJson.mockRestore();
216
- });
217
- it('should throw in incrementPatternUsage when indexed access returns undefined', async () => {
218
- mockReadJson.mockResolvedValueOnce(makeSparseArray());
219
- await expect(incrementPatternUsage(PROJECT_ID, 'any-id')).rejects.toThrow('Pattern "any-id" not found');
220
- mockReadJson.mockRestore();
221
- });
222
- });
223
- });
224
- //# sourceMappingURL=pattern-store.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pattern-store.test.js","sourceRoot":"","sources":["../../src/storage/pattern-store.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=spec-store.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"spec-store.test.d.ts","sourceRoot":"","sources":["../../src/storage/spec-store.test.ts"],"names":[],"mappings":""}
@@ -1,227 +0,0 @@
1
- // spec-store.test.ts — Unit tests for spec CRUD operations
2
- import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
3
- import { mkdtemp, rm } from 'node:fs/promises';
4
- import { join } from 'node:path';
5
- import { tmpdir } from 'node:os';
6
- // Mock projectDataDir to use a temp directory for isolation
7
- let tempDir;
8
- vi.mock('./base-store.js', async (importOriginal) => {
9
- const original = await importOriginal();
10
- return {
11
- ...original,
12
- readJson: vi.fn(original.readJson),
13
- projectDataDir: (projectId) => join(tempDir, 'projects', projectId),
14
- };
15
- });
16
- // Import AFTER mock is set up
17
- const baseStore = await import('./base-store.js');
18
- const mockReadJson = vi.mocked(baseStore.readJson);
19
- const { createSpec, getSpec, updateSpec, listSpecs, deleteSpec, findSpecs, countSpecs, updateSpecStatus, } = await import('./spec-store.js');
20
- function makeSpec(overrides = {}) {
21
- return {
22
- id: 'SPEC-001',
23
- title: 'Test Spec',
24
- slug: 'test-spec',
25
- type: 'feature',
26
- scope: 'feature',
27
- status: 'draft',
28
- difficulty: 3,
29
- risk: 'medium',
30
- projectId: 'proj-abc',
31
- createdAt: '2026-01-01T00:00:00.000Z',
32
- updatedAt: '2026-01-01T00:00:00.000Z',
33
- huPath: 'docs/sdd/specs/SPEC-001/HU.md',
34
- fichaTecnicaPath: 'docs/sdd/specs/SPEC-001/FICHA-TECNICA.md',
35
- estimation: {
36
- devHours: 8,
37
- reviewHours: 2,
38
- recommendedModel: 'sonnet',
39
- tokensOpus: 0,
40
- tokensSonnet: 50000,
41
- apiCostUsd: 0.15,
42
- hourlyRate: 50,
43
- humanCostUsd: 500,
44
- totalCostUsd: 500.15,
45
- tokenOptimization: {
46
- mode: 'template',
47
- reasoning: 'Standard feature',
48
- estimatedTokens: 50000,
49
- savings: '30%',
50
- },
51
- },
52
- actuals: null,
53
- target: 'backend',
54
- tags: ['api', 'crud'],
55
- dependencies: [],
56
- blockedBy: [],
57
- gitBranch: 'feat/SPEC-001-test-spec',
58
- impactAnalysis: null,
59
- ...overrides,
60
- };
61
- }
62
- describe('spec-store', () => {
63
- beforeEach(async () => {
64
- tempDir = await mkdtemp(join(tmpdir(), 'sdd-spec-store-test-'));
65
- });
66
- afterEach(async () => {
67
- await rm(tempDir, { recursive: true, force: true });
68
- vi.restoreAllMocks();
69
- });
70
- const PROJECT_ID = 'test-project-1';
71
- describe('createSpec', () => {
72
- it('should create a new spec and return it', async () => {
73
- const spec = makeSpec({ projectId: PROJECT_ID });
74
- const result = await createSpec(PROJECT_ID, spec);
75
- expect(result).toEqual(spec);
76
- expect(result.id).toBe('SPEC-001');
77
- expect(result.title).toBe('Test Spec');
78
- });
79
- it('should throw when creating a spec with a duplicate id', async () => {
80
- const spec = makeSpec({ projectId: PROJECT_ID });
81
- await createSpec(PROJECT_ID, spec);
82
- await expect(createSpec(PROJECT_ID, spec)).rejects.toThrow('Spec "SPEC-001" already exists');
83
- });
84
- it('should allow creating multiple specs with different ids', async () => {
85
- const spec1 = makeSpec({ id: 'SPEC-001', projectId: PROJECT_ID });
86
- const spec2 = makeSpec({ id: 'SPEC-002', title: 'Second Spec', projectId: PROJECT_ID });
87
- await createSpec(PROJECT_ID, spec1);
88
- await createSpec(PROJECT_ID, spec2);
89
- const all = await listSpecs(PROJECT_ID);
90
- expect(all).toHaveLength(2);
91
- });
92
- });
93
- describe('getSpec', () => {
94
- it('should return null when spec does not exist', async () => {
95
- const result = await getSpec(PROJECT_ID, 'nonexistent');
96
- expect(result).toBeNull();
97
- });
98
- it('should retrieve a previously created spec', async () => {
99
- const spec = makeSpec({ projectId: PROJECT_ID });
100
- await createSpec(PROJECT_ID, spec);
101
- const result = await getSpec(PROJECT_ID, 'SPEC-001');
102
- expect(result).toEqual(spec);
103
- });
104
- it('should return null for an empty project', async () => {
105
- const result = await getSpec(PROJECT_ID, 'SPEC-001');
106
- expect(result).toBeNull();
107
- });
108
- });
109
- describe('updateSpec', () => {
110
- it('should update an existing spec with partial data', async () => {
111
- const spec = makeSpec({ projectId: PROJECT_ID });
112
- await createSpec(PROJECT_ID, spec);
113
- const result = await updateSpec(PROJECT_ID, 'SPEC-001', { title: 'Updated Title' });
114
- expect(result.title).toBe('Updated Title');
115
- expect(result.id).toBe('SPEC-001');
116
- expect(result.updatedAt).not.toBe(spec.updatedAt);
117
- });
118
- it('should throw when updating a non-existent spec', async () => {
119
- await expect(updateSpec(PROJECT_ID, 'nonexistent', { title: 'New' })).rejects.toThrow('Spec "nonexistent" not found');
120
- });
121
- it('should never allow id override through updates', async () => {
122
- const spec = makeSpec({ projectId: PROJECT_ID });
123
- await createSpec(PROJECT_ID, spec);
124
- const result = await updateSpec(PROJECT_ID, 'SPEC-001', {
125
- id: 'TAMPERED-ID',
126
- title: 'Hacked',
127
- });
128
- expect(result.id).toBe('SPEC-001');
129
- });
130
- it('should persist updates to disk', async () => {
131
- const spec = makeSpec({ projectId: PROJECT_ID });
132
- await createSpec(PROJECT_ID, spec);
133
- await updateSpec(PROJECT_ID, 'SPEC-001', { status: 'approved' });
134
- const fetched = await getSpec(PROJECT_ID, 'SPEC-001');
135
- expect(fetched?.status).toBe('approved');
136
- });
137
- });
138
- describe('updateSpecStatus', () => {
139
- it('should update only the status field', async () => {
140
- const spec = makeSpec({ projectId: PROJECT_ID });
141
- await createSpec(PROJECT_ID, spec);
142
- const result = await updateSpecStatus(PROJECT_ID, 'SPEC-001', 'implementing');
143
- expect(result.status).toBe('implementing');
144
- expect(result.title).toBe('Test Spec');
145
- });
146
- });
147
- describe('listSpecs', () => {
148
- it('should return an empty array for a new project', async () => {
149
- const result = await listSpecs(PROJECT_ID);
150
- expect(result).toEqual([]);
151
- });
152
- it('should return all specs for a project', async () => {
153
- await createSpec(PROJECT_ID, makeSpec({ id: 'SPEC-001', projectId: PROJECT_ID }));
154
- await createSpec(PROJECT_ID, makeSpec({ id: 'SPEC-002', projectId: PROJECT_ID }));
155
- await createSpec(PROJECT_ID, makeSpec({ id: 'SPEC-003', projectId: PROJECT_ID }));
156
- const result = await listSpecs(PROJECT_ID);
157
- expect(result).toHaveLength(3);
158
- });
159
- it('should isolate specs between different projects', async () => {
160
- await createSpec('project-a', makeSpec({ id: 'SPEC-001', projectId: 'project-a' }));
161
- await createSpec('project-b', makeSpec({ id: 'SPEC-001', projectId: 'project-b' }));
162
- const specsA = await listSpecs('project-a');
163
- const specsB = await listSpecs('project-b');
164
- expect(specsA).toHaveLength(1);
165
- expect(specsB).toHaveLength(1);
166
- });
167
- });
168
- describe('deleteSpec', () => {
169
- it('should return true when deleting an existing spec', async () => {
170
- await createSpec(PROJECT_ID, makeSpec({ projectId: PROJECT_ID }));
171
- const result = await deleteSpec(PROJECT_ID, 'SPEC-001');
172
- expect(result).toBe(true);
173
- const fetched = await getSpec(PROJECT_ID, 'SPEC-001');
174
- expect(fetched).toBeNull();
175
- });
176
- it('should return false when deleting a non-existent spec', async () => {
177
- const result = await deleteSpec(PROJECT_ID, 'nonexistent');
178
- expect(result).toBe(false);
179
- });
180
- });
181
- describe('findSpecs', () => {
182
- it('should filter specs by predicate', async () => {
183
- await createSpec(PROJECT_ID, makeSpec({ id: 'SPEC-001', status: 'draft', projectId: PROJECT_ID }));
184
- await createSpec(PROJECT_ID, makeSpec({ id: 'SPEC-002', status: 'approved', projectId: PROJECT_ID }));
185
- await createSpec(PROJECT_ID, makeSpec({ id: 'SPEC-003', status: 'draft', projectId: PROJECT_ID }));
186
- const drafts = await findSpecs(PROJECT_ID, (s) => s.status === 'draft');
187
- expect(drafts).toHaveLength(2);
188
- });
189
- });
190
- describe('countSpecs', () => {
191
- it('should return 0 for an empty project', async () => {
192
- const count = await countSpecs(PROJECT_ID);
193
- expect(count).toBe(0);
194
- });
195
- it('should count all specs when no status filter is provided', async () => {
196
- await createSpec(PROJECT_ID, makeSpec({ id: 'SPEC-001', projectId: PROJECT_ID }));
197
- await createSpec(PROJECT_ID, makeSpec({ id: 'SPEC-002', projectId: PROJECT_ID }));
198
- const count = await countSpecs(PROJECT_ID);
199
- expect(count).toBe(2);
200
- });
201
- it('should count only specs matching the given status', async () => {
202
- await createSpec(PROJECT_ID, makeSpec({ id: 'SPEC-001', status: 'draft', projectId: PROJECT_ID }));
203
- await createSpec(PROJECT_ID, makeSpec({ id: 'SPEC-002', status: 'approved', projectId: PROJECT_ID }));
204
- await createSpec(PROJECT_ID, makeSpec({ id: 'SPEC-003', status: 'draft', projectId: PROJECT_ID }));
205
- const draftCount = await countSpecs(PROJECT_ID, 'draft');
206
- expect(draftCount).toBe(2);
207
- const approvedCount = await countSpecs(PROJECT_ID, 'approved');
208
- expect(approvedCount).toBe(1);
209
- });
210
- });
211
- describe('defensive guard for noUncheckedIndexedAccess', () => {
212
- it('should throw in updateSpec when indexed access returns undefined', async () => {
213
- const sparseArray = new Proxy([], {
214
- get(target, prop) {
215
- if (prop === 'findIndex') {
216
- return () => 0;
217
- }
218
- return Reflect.get(target, prop);
219
- },
220
- });
221
- mockReadJson.mockResolvedValueOnce(sparseArray);
222
- await expect(updateSpec(PROJECT_ID, 'SPEC-001', { title: 'New' })).rejects.toThrow('Spec "SPEC-001" not found');
223
- mockReadJson.mockRestore();
224
- });
225
- });
226
- });
227
- //# sourceMappingURL=spec-store.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"spec-store.test.js","sourceRoot":"","sources":["../../src/storage/spec-store.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=audit.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"audit.test.d.ts","sourceRoot":"","sources":["../../src/tools/audit.test.ts"],"names":[],"mappings":""}