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,368 +0,0 @@
1
- // knowledge-store.test.ts — Unit tests for knowledge, constitution, clarifications, and NLI context
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 { getKnowledge, saveKnowledge, updateKnowledge, deleteKnowledge, getConstitution, saveConstitution, updateConstitution, listClarifications, getClarification, addClarification, updateClarification, deleteClarification, getNLIContext, saveNLIContext, addUserPattern, appendConversationMemory, clearNLIContext, } = await import('./knowledge-store.js');
19
- const PROJECT_ID = 'knowledge-test-proj';
20
- function makeKnowledge(overrides = {}) {
21
- return {
22
- projectId: PROJECT_ID,
23
- projectPath: '/tmp/test-project',
24
- locale: 'en',
25
- experienceLevel: 'intermediate',
26
- language: 'typescript',
27
- framework: 'express',
28
- packageManager: 'npm',
29
- buildCommand: 'npm run build',
30
- testCommand: 'npm test',
31
- stack: ['typescript', 'express', 'postgresql'],
32
- database: 'postgresql',
33
- architecture: {
34
- primary: 'layered',
35
- secondary: [],
36
- layers: [],
37
- boundaries: [],
38
- communicationPatterns: [],
39
- deploymentUnits: [],
40
- },
41
- apps: [],
42
- conventions: {},
43
- layers: ['controllers', 'services', 'repositories'],
44
- environments: ['development', 'staging', 'production'],
45
- apiContracts: [],
46
- specLocation: 'docs/sdd/specs',
47
- envSetup: {
48
- projectId: PROJECT_ID,
49
- variables: [],
50
- missing: [],
51
- security: {
52
- gitignoreHasEnv: true,
53
- noSecretsInCode: true,
54
- noEnvInGit: true,
55
- noSecretsInLogs: true,
56
- usesSecretManager: false,
57
- issues: [],
58
- },
59
- setupSteps: [],
60
- },
61
- linting: {
62
- projectId: PROJECT_ID,
63
- language: 'typescript',
64
- detectedLinters: [],
65
- missingRecommended: [],
66
- rulesConflicts: [],
67
- customRulesFromProject: [],
68
- maturityScore: 0,
69
- },
70
- availableMcps: [],
71
- docsRegistry: {},
72
- qualityProfile: {
73
- enabledCategories: [],
74
- customRules: [],
75
- principles: [],
76
- strictness: 'standard',
77
- },
78
- lastAnalyzed: '2026-01-01T00:00:00.000Z',
79
- ...overrides,
80
- };
81
- }
82
- function makeConstitution(overrides = {}) {
83
- return {
84
- projectId: PROJECT_ID,
85
- principles: [
86
- {
87
- id: 'principle-1',
88
- category: 'architecture',
89
- principle: 'Use layered architecture',
90
- rationale: 'Separation of concerns',
91
- enforceLevel: 'strict',
92
- autoEnforceable: true,
93
- source: 'auto-detected',
94
- immutable: false,
95
- },
96
- ],
97
- createdAt: '2026-01-01T00:00:00.000Z',
98
- updatedAt: '2026-01-01T00:00:00.000Z',
99
- version: 1,
100
- ...overrides,
101
- };
102
- }
103
- function makeClarification(overrides = {}) {
104
- return {
105
- id: 'clarify-001',
106
- projectId: PROJECT_ID,
107
- topic: 'authentication',
108
- questions: [
109
- {
110
- id: 'q-1',
111
- question: 'What auth provider to use?',
112
- category: 'requirements',
113
- importance: 'critical',
114
- },
115
- ],
116
- answers: {},
117
- isComplete: false,
118
- createdAt: '2026-01-15T00:00:00.000Z',
119
- ...overrides,
120
- };
121
- }
122
- describe('knowledge-store', () => {
123
- beforeEach(async () => {
124
- tempDir = await mkdtemp(join(tmpdir(), 'sdd-knowledge-store-test-'));
125
- });
126
- afterEach(async () => {
127
- await rm(tempDir, { recursive: true, force: true });
128
- vi.clearAllMocks();
129
- });
130
- describe('getKnowledge / saveKnowledge', () => {
131
- it('should return null when no knowledge exists', async () => {
132
- const result = await getKnowledge(PROJECT_ID);
133
- expect(result).toBeNull();
134
- });
135
- it('should save and retrieve knowledge', async () => {
136
- const knowledge = makeKnowledge();
137
- await saveKnowledge(PROJECT_ID, knowledge);
138
- const result = await getKnowledge(PROJECT_ID);
139
- expect(result).toEqual(knowledge);
140
- });
141
- it('should overwrite existing knowledge on second save', async () => {
142
- await saveKnowledge(PROJECT_ID, makeKnowledge({ language: 'javascript' }));
143
- await saveKnowledge(PROJECT_ID, makeKnowledge({ language: 'python' }));
144
- const result = await getKnowledge(PROJECT_ID);
145
- expect(result?.language).toBe('python');
146
- });
147
- });
148
- describe('updateKnowledge', () => {
149
- it('should throw when no knowledge exists yet', async () => {
150
- await expect(updateKnowledge(PROJECT_ID, { language: 'rust' })).rejects.toThrow('No knowledge found');
151
- });
152
- it('should merge partial updates into existing knowledge', async () => {
153
- await saveKnowledge(PROJECT_ID, makeKnowledge());
154
- const result = await updateKnowledge(PROJECT_ID, { language: 'go' });
155
- expect(result.language).toBe('go');
156
- expect(result.framework).toBe('express');
157
- expect(result.projectId).toBe(PROJECT_ID);
158
- });
159
- it('should update the lastAnalyzed timestamp', async () => {
160
- await saveKnowledge(PROJECT_ID, makeKnowledge());
161
- const result = await updateKnowledge(PROJECT_ID, { language: 'rust' });
162
- expect(result.lastAnalyzed).not.toBe('2026-01-01T00:00:00.000Z');
163
- });
164
- it('should never allow projectId to be overridden', async () => {
165
- await saveKnowledge(PROJECT_ID, makeKnowledge());
166
- const result = await updateKnowledge(PROJECT_ID, {
167
- projectId: 'tampered-id',
168
- });
169
- expect(result.projectId).toBe(PROJECT_ID);
170
- });
171
- });
172
- describe('deleteKnowledge', () => {
173
- it('should return false when no knowledge exists', async () => {
174
- const result = await deleteKnowledge(PROJECT_ID);
175
- expect(result).toBe(false);
176
- });
177
- it('should return true and remove existing knowledge', async () => {
178
- await saveKnowledge(PROJECT_ID, makeKnowledge());
179
- const result = await deleteKnowledge(PROJECT_ID);
180
- expect(result).toBe(true);
181
- const fetched = await getKnowledge(PROJECT_ID);
182
- expect(fetched).toBeNull();
183
- });
184
- });
185
- describe('getConstitution / saveConstitution', () => {
186
- it('should return null when no constitution exists', async () => {
187
- const result = await getConstitution(PROJECT_ID);
188
- expect(result).toBeNull();
189
- });
190
- it('should save and retrieve a constitution', async () => {
191
- const constitution = makeConstitution();
192
- await saveConstitution(PROJECT_ID, constitution);
193
- const result = await getConstitution(PROJECT_ID);
194
- expect(result).toEqual(constitution);
195
- expect(result?.principles).toHaveLength(1);
196
- });
197
- });
198
- describe('updateConstitution', () => {
199
- it('should throw when no constitution exists yet', async () => {
200
- await expect(updateConstitution(PROJECT_ID, { version: 2 })).rejects.toThrow('No constitution found');
201
- });
202
- it('should merge updates and bump version', async () => {
203
- await saveConstitution(PROJECT_ID, makeConstitution());
204
- const result = await updateConstitution(PROJECT_ID, {
205
- principles: [],
206
- });
207
- expect(result.version).toBe(2);
208
- expect(result.principles).toEqual([]);
209
- expect(result.projectId).toBe(PROJECT_ID);
210
- });
211
- it('should update the updatedAt timestamp', async () => {
212
- await saveConstitution(PROJECT_ID, makeConstitution());
213
- const result = await updateConstitution(PROJECT_ID, {});
214
- expect(result.updatedAt).not.toBe('2026-01-01T00:00:00.000Z');
215
- });
216
- });
217
- describe('clarification sessions', () => {
218
- it('should return an empty array when no clarifications exist', async () => {
219
- const result = await listClarifications(PROJECT_ID);
220
- expect(result).toEqual([]);
221
- });
222
- it('should add and list clarification sessions', async () => {
223
- const session = makeClarification();
224
- await addClarification(PROJECT_ID, session);
225
- const all = await listClarifications(PROJECT_ID);
226
- expect(all).toHaveLength(1);
227
- expect(all[0]?.topic).toBe('authentication');
228
- });
229
- it('should get a single clarification by id', async () => {
230
- await addClarification(PROJECT_ID, makeClarification({ id: 'clarify-001' }));
231
- await addClarification(PROJECT_ID, makeClarification({ id: 'clarify-002', topic: 'authorization' }));
232
- const result = await getClarification(PROJECT_ID, 'clarify-002');
233
- expect(result?.topic).toBe('authorization');
234
- });
235
- it('should return null for a non-existent clarification', async () => {
236
- const result = await getClarification(PROJECT_ID, 'nonexistent');
237
- expect(result).toBeNull();
238
- });
239
- it('should update an existing clarification session', async () => {
240
- await addClarification(PROJECT_ID, makeClarification());
241
- const result = await updateClarification(PROJECT_ID, 'clarify-001', {
242
- isComplete: true,
243
- answers: { 'q-1': 'Use OAuth2' },
244
- });
245
- expect(result.isComplete).toBe(true);
246
- expect(result.answers['q-1']).toBe('Use OAuth2');
247
- });
248
- it('should throw when updating a non-existent clarification', async () => {
249
- await expect(updateClarification(PROJECT_ID, 'nonexistent', { isComplete: true })).rejects.toThrow('Clarification session "nonexistent" not found');
250
- });
251
- it('should delete a clarification session', async () => {
252
- await addClarification(PROJECT_ID, makeClarification());
253
- const removed = await deleteClarification(PROJECT_ID, 'clarify-001');
254
- expect(removed).toBe(true);
255
- const remaining = await listClarifications(PROJECT_ID);
256
- expect(remaining).toHaveLength(0);
257
- });
258
- it('should return false when deleting a non-existent clarification', async () => {
259
- const removed = await deleteClarification(PROJECT_ID, 'nonexistent');
260
- expect(removed).toBe(false);
261
- });
262
- });
263
- describe('defensive guard for noUncheckedIndexedAccess', () => {
264
- it('should throw in updateClarification when indexed access returns undefined', async () => {
265
- const sparseArray = new Proxy([], {
266
- get(target, prop) {
267
- if (prop === 'findIndex') {
268
- return () => 0;
269
- }
270
- return Reflect.get(target, prop);
271
- },
272
- });
273
- mockReadJson.mockResolvedValueOnce(sparseArray);
274
- await expect(updateClarification(PROJECT_ID, 'clarify-001', { isComplete: true })).rejects.toThrow('Clarification session "clarify-001" not found');
275
- mockReadJson.mockRestore();
276
- });
277
- });
278
- describe('NLI Context', () => {
279
- // Each NLI test uses a unique project ID to avoid filesystem state leakage
280
- // between tests (temp dir mock may share state across sequential tests)
281
- it('should return a default empty context when none exists', async () => {
282
- const pid = 'nli-default';
283
- const result = await getNLIContext(pid);
284
- expect(result.currentProject).toBe(pid);
285
- expect(result.lastSpecs).toEqual([]);
286
- expect(result.lastTools).toEqual([]);
287
- expect(result.conversationMemory).toEqual([]);
288
- expect(result.userPatterns).toEqual([]);
289
- });
290
- it('should save and retrieve NLI context', async () => {
291
- const pid = 'nli-save';
292
- const context = {
293
- currentProject: pid,
294
- lastSpecs: ['SPEC-001'],
295
- lastTools: ['create-spec'],
296
- conversationMemory: ['Created spec SPEC-001'],
297
- userPatterns: [],
298
- };
299
- await saveNLIContext(pid, context);
300
- const result = await getNLIContext(pid);
301
- expect(result.lastSpecs).toEqual(['SPEC-001']);
302
- });
303
- it('should add a new user pattern', async () => {
304
- const pid = 'nli-add-pattern';
305
- const pattern = {
306
- phrase: 'create a new spec',
307
- mappedTool: 'sdd_create_spec',
308
- frequency: 1,
309
- locale: 'en',
310
- };
311
- const result = await addUserPattern(pid, pattern);
312
- expect(result.userPatterns).toHaveLength(1);
313
- expect(result.userPatterns[0]?.phrase).toBe('create a new spec');
314
- });
315
- it('should increment frequency for duplicate phrase+tool patterns', async () => {
316
- const pid = `nli-incr-${Date.now()}`;
317
- // Ensure clean context
318
- await clearNLIContext(pid);
319
- const pattern = {
320
- phrase: 'estimate spec',
321
- mappedTool: 'sdd_estimate',
322
- frequency: 1,
323
- locale: 'en',
324
- };
325
- await addUserPattern(pid, pattern);
326
- const result = await addUserPattern(pid, { ...pattern, frequency: 3 });
327
- expect(result.userPatterns).toHaveLength(1);
328
- expect(result.userPatterns[0]?.frequency).toBe(4);
329
- });
330
- it('should append entries to conversation memory', async () => {
331
- const pid = 'nli-append';
332
- await appendConversationMemory(pid, ['entry-1', 'entry-2']);
333
- await appendConversationMemory(pid, ['entry-3']);
334
- const result = await getNLIContext(pid);
335
- expect(result.conversationMemory).toEqual(['entry-1', 'entry-2', 'entry-3']);
336
- });
337
- it('should trim conversation memory to maxEntries', async () => {
338
- const pid = 'nli-trim';
339
- const entries = Array.from({ length: 60 }, (_, i) => `entry-${i}`);
340
- await appendConversationMemory(pid, entries, 50);
341
- const result = await getNLIContext(pid);
342
- expect(result.conversationMemory).toHaveLength(50);
343
- expect(result.conversationMemory[0]).toBe('entry-10');
344
- });
345
- it('should clear the NLI context', async () => {
346
- const pid = `nli-clr-${Date.now()}`;
347
- // Ensure clean context, then populate, then clear
348
- await clearNLIContext(pid);
349
- await addUserPattern(pid, {
350
- phrase: 'test',
351
- mappedTool: 'tool',
352
- frequency: 1,
353
- locale: 'en',
354
- });
355
- await appendConversationMemory(pid, ['memory']);
356
- // Verify data was added
357
- const before = await getNLIContext(pid);
358
- expect(before.userPatterns.length).toBeGreaterThan(0);
359
- // Now clear and verify
360
- await clearNLIContext(pid);
361
- const result = await getNLIContext(pid);
362
- expect(result.userPatterns).toEqual([]);
363
- expect(result.conversationMemory).toEqual([]);
364
- expect(result.currentProject).toBe(pid);
365
- });
366
- });
367
- });
368
- //# sourceMappingURL=knowledge-store.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"knowledge-store.test.js","sourceRoot":"","sources":["../../src/storage/knowledge-store.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=metrics-store.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"metrics-store.test.d.ts","sourceRoot":"","sources":["../../src/storage/metrics-store.test.ts"],"names":[],"mappings":""}
@@ -1,212 +0,0 @@
1
- // metrics-store.test.ts — Unit tests for metrics history and token budget
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
- projectDataDir: (projectId) => join(tempDir, 'projects', projectId),
13
- };
14
- });
15
- const { getMetricsHistory, addMetricEntry, getMetricsByDifficulty, getMetricsForSpec, getAverageAccuracy, deleteMetricsForSpec, clearMetrics, getTokenBudget, saveTokenBudget, } = await import('./metrics-store.js');
16
- const PROJECT_ID = 'metrics-test-proj';
17
- function makeEntry(overrides = {}) {
18
- return {
19
- specId: 'SPEC-001',
20
- difficulty: 3,
21
- estimated: {
22
- devHours: 8,
23
- reviewHours: 2,
24
- recommendedModel: 'sonnet',
25
- tokensOpus: 0,
26
- tokensSonnet: 50000,
27
- apiCostUsd: 0.15,
28
- hourlyRate: 50,
29
- humanCostUsd: 500,
30
- totalCostUsd: 500.15,
31
- tokenOptimization: {
32
- mode: 'template',
33
- reasoning: 'Standard feature',
34
- estimatedTokens: 50000,
35
- savings: '30%',
36
- },
37
- },
38
- actual: {
39
- devHours: 10,
40
- reviewHours: 3,
41
- tokensOpus: 1000,
42
- tokensSonnet: 60000,
43
- apiCostUsd: 0.2,
44
- humanCostUsd: 650,
45
- totalCostUsd: 650.2,
46
- completedAt: '2026-01-15T00:00:00.000Z',
47
- notes: 'Took longer than expected',
48
- },
49
- accuracyScore: 0.75,
50
- ...overrides,
51
- };
52
- }
53
- describe('metrics-store', () => {
54
- beforeEach(async () => {
55
- tempDir = await mkdtemp(join(tmpdir(), 'sdd-metrics-store-test-'));
56
- });
57
- afterEach(async () => {
58
- await rm(tempDir, { recursive: true, force: true });
59
- vi.restoreAllMocks();
60
- });
61
- describe('getMetricsHistory', () => {
62
- it('should return an empty history for a new project', async () => {
63
- const result = await getMetricsHistory(PROJECT_ID);
64
- expect(result.projectId).toBe(PROJECT_ID);
65
- expect(result.entries).toEqual([]);
66
- });
67
- });
68
- describe('addMetricEntry', () => {
69
- it('should add a single metric entry', async () => {
70
- const entry = makeEntry();
71
- const result = await addMetricEntry(PROJECT_ID, entry);
72
- expect(result.entries).toHaveLength(1);
73
- expect(result.entries[0]?.specId).toBe('SPEC-001');
74
- });
75
- it('should accumulate multiple entries', async () => {
76
- await addMetricEntry(PROJECT_ID, makeEntry({ specId: 'SPEC-001' }));
77
- await addMetricEntry(PROJECT_ID, makeEntry({ specId: 'SPEC-002' }));
78
- await addMetricEntry(PROJECT_ID, makeEntry({ specId: 'SPEC-003' }));
79
- const history = await getMetricsHistory(PROJECT_ID);
80
- expect(history.entries).toHaveLength(3);
81
- });
82
- it('should allow multiple entries for the same spec', async () => {
83
- await addMetricEntry(PROJECT_ID, makeEntry({ specId: 'SPEC-001', accuracyScore: 0.5 }));
84
- await addMetricEntry(PROJECT_ID, makeEntry({ specId: 'SPEC-001', accuracyScore: 0.9 }));
85
- const entries = await getMetricsForSpec(PROJECT_ID, 'SPEC-001');
86
- expect(entries).toHaveLength(2);
87
- });
88
- });
89
- describe('getMetricsByDifficulty', () => {
90
- it('should filter entries by difficulty level', async () => {
91
- await addMetricEntry(PROJECT_ID, makeEntry({ specId: 'SPEC-001', difficulty: 1 }));
92
- await addMetricEntry(PROJECT_ID, makeEntry({ specId: 'SPEC-002', difficulty: 3 }));
93
- await addMetricEntry(PROJECT_ID, makeEntry({ specId: 'SPEC-003', difficulty: 3 }));
94
- await addMetricEntry(PROJECT_ID, makeEntry({ specId: 'SPEC-004', difficulty: 5 }));
95
- const easy = await getMetricsByDifficulty(PROJECT_ID, 1);
96
- expect(easy).toHaveLength(1);
97
- const medium = await getMetricsByDifficulty(PROJECT_ID, 3);
98
- expect(medium).toHaveLength(2);
99
- const hard = await getMetricsByDifficulty(PROJECT_ID, 5);
100
- expect(hard).toHaveLength(1);
101
- });
102
- it('should return an empty array when no entries match', async () => {
103
- await addMetricEntry(PROJECT_ID, makeEntry({ difficulty: 1 }));
104
- const result = await getMetricsByDifficulty(PROJECT_ID, 5);
105
- expect(result).toEqual([]);
106
- });
107
- });
108
- describe('getMetricsForSpec', () => {
109
- it('should return entries for a specific spec', async () => {
110
- await addMetricEntry(PROJECT_ID, makeEntry({ specId: 'SPEC-001' }));
111
- await addMetricEntry(PROJECT_ID, makeEntry({ specId: 'SPEC-002' }));
112
- const result = await getMetricsForSpec(PROJECT_ID, 'SPEC-001');
113
- expect(result).toHaveLength(1);
114
- expect(result[0]?.specId).toBe('SPEC-001');
115
- });
116
- it('should return an empty array for a spec with no entries', async () => {
117
- const result = await getMetricsForSpec(PROJECT_ID, 'nonexistent');
118
- expect(result).toEqual([]);
119
- });
120
- });
121
- describe('getAverageAccuracy', () => {
122
- it('should return 0 when there are no entries', async () => {
123
- const result = await getAverageAccuracy(PROJECT_ID);
124
- expect(result).toBe(0);
125
- });
126
- it('should compute the average accuracy score', async () => {
127
- await addMetricEntry(PROJECT_ID, makeEntry({ accuracyScore: 0.8 }));
128
- await addMetricEntry(PROJECT_ID, makeEntry({ accuracyScore: 0.6 }));
129
- await addMetricEntry(PROJECT_ID, makeEntry({ accuracyScore: 1.0 }));
130
- const result = await getAverageAccuracy(PROJECT_ID);
131
- expect(result).toBeCloseTo(0.8, 5);
132
- });
133
- it('should handle a single entry', async () => {
134
- await addMetricEntry(PROJECT_ID, makeEntry({ accuracyScore: 0.95 }));
135
- const result = await getAverageAccuracy(PROJECT_ID);
136
- expect(result).toBe(0.95);
137
- });
138
- });
139
- describe('deleteMetricsForSpec', () => {
140
- it('should remove all entries for a given spec', async () => {
141
- await addMetricEntry(PROJECT_ID, makeEntry({ specId: 'SPEC-001' }));
142
- await addMetricEntry(PROJECT_ID, makeEntry({ specId: 'SPEC-001' }));
143
- await addMetricEntry(PROJECT_ID, makeEntry({ specId: 'SPEC-002' }));
144
- const removed = await deleteMetricsForSpec(PROJECT_ID, 'SPEC-001');
145
- expect(removed).toBe(2);
146
- const history = await getMetricsHistory(PROJECT_ID);
147
- expect(history.entries).toHaveLength(1);
148
- expect(history.entries[0]?.specId).toBe('SPEC-002');
149
- });
150
- it('should return 0 when no entries exist for the spec', async () => {
151
- const removed = await deleteMetricsForSpec(PROJECT_ID, 'nonexistent');
152
- expect(removed).toBe(0);
153
- });
154
- });
155
- describe('clearMetrics', () => {
156
- it('should remove all entries for a project', async () => {
157
- await addMetricEntry(PROJECT_ID, makeEntry({ specId: 'SPEC-001' }));
158
- await addMetricEntry(PROJECT_ID, makeEntry({ specId: 'SPEC-002' }));
159
- await clearMetrics(PROJECT_ID);
160
- const history = await getMetricsHistory(PROJECT_ID);
161
- expect(history.entries).toEqual([]);
162
- expect(history.projectId).toBe(PROJECT_ID);
163
- });
164
- });
165
- describe('token budget', () => {
166
- it('should return a default budget when none exists', async () => {
167
- const result = await getTokenBudget(PROJECT_ID);
168
- expect(result.projectId).toBe(PROJECT_ID);
169
- expect(result.monthlyBudgetUsd).toBe(0);
170
- expect(result.spentThisMonth).toBe(0);
171
- expect(result.remainingUsd).toBe(0);
172
- expect(result.tokensByMode.local).toBe(0);
173
- expect(result.savingsVsNaive).toBe(0);
174
- });
175
- it('should save and retrieve a token budget', async () => {
176
- const budget = {
177
- projectId: PROJECT_ID,
178
- monthlyBudgetUsd: 100,
179
- spentThisMonth: 25,
180
- remainingUsd: 75,
181
- tokensByMode: { local: 1000, template: 2000, 'light-llm': 500, 'full-llm': 300 },
182
- savingsVsNaive: 40,
183
- };
184
- await saveTokenBudget(PROJECT_ID, budget);
185
- const result = await getTokenBudget(PROJECT_ID);
186
- expect(result.monthlyBudgetUsd).toBe(100);
187
- expect(result.spentThisMonth).toBe(25);
188
- expect(result.tokensByMode.template).toBe(2000);
189
- });
190
- it('should overwrite a previously saved budget', async () => {
191
- const budget1 = {
192
- projectId: PROJECT_ID,
193
- monthlyBudgetUsd: 50,
194
- spentThisMonth: 10,
195
- remainingUsd: 40,
196
- tokensByMode: { local: 0, template: 0, 'light-llm': 0, 'full-llm': 0 },
197
- savingsVsNaive: 0,
198
- };
199
- await saveTokenBudget(PROJECT_ID, budget1);
200
- const budget2 = {
201
- ...budget1,
202
- spentThisMonth: 30,
203
- remainingUsd: 20,
204
- };
205
- await saveTokenBudget(PROJECT_ID, budget2);
206
- const result = await getTokenBudget(PROJECT_ID);
207
- expect(result.spentThisMonth).toBe(30);
208
- expect(result.remainingUsd).toBe(20);
209
- });
210
- });
211
- });
212
- //# sourceMappingURL=metrics-store.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"metrics-store.test.js","sourceRoot":"","sources":["../../src/storage/metrics-store.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=pattern-store.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pattern-store.test.d.ts","sourceRoot":"","sources":["../../src/storage/pattern-store.test.ts"],"names":[],"mappings":""}