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.
- package/README.md +31 -1
- package/dist/config/version.d.ts +2 -0
- package/dist/config/version.d.ts.map +1 -0
- package/dist/config/version.js +9 -0
- package/dist/config/version.js.map +1 -0
- package/dist/config/version.ts +11 -0
- package/dist/engine/detectors/library-detector-langs2.d.ts.map +1 -1
- package/dist/engine/detectors/library-detector-langs2.js.map +1 -1
- package/dist/engine/mermaid-generator.d.ts.map +1 -1
- package/dist/engine/mermaid-generator.js +12 -2
- package/dist/engine/mermaid-generator.js.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/tools/create-spec-hu/hu-body-generators.d.ts.map +1 -1
- package/dist/tools/create-spec-hu/hu-body-generators.js +7 -1
- package/dist/tools/create-spec-hu/hu-body-generators.js.map +1 -1
- package/dist/tools/create-spec-tech/ficha-content.d.ts.map +1 -1
- package/dist/tools/create-spec-tech/ficha-content.js +4 -2
- package/dist/tools/create-spec-tech/ficha-content.js.map +1 -1
- package/dist/tools/create-spec.d.ts.map +1 -1
- package/dist/tools/create-spec.js +4 -3
- package/dist/tools/create-spec.js.map +1 -1
- package/dist/tools/register-spec-tools/core-spec-tools.d.ts.map +1 -1
- package/dist/tools/register-spec-tools/core-spec-tools.js +4 -0
- package/dist/tools/register-spec-tools/core-spec-tools.js.map +1 -1
- package/dist/types/spec/core.d.ts +1 -0
- package/dist/types/spec/core.d.ts.map +1 -1
- package/dist/types/spec/inputs.d.ts +1 -0
- package/dist/types/spec/inputs.d.ts.map +1 -1
- package/package.json +27 -18
- package/src/config/version.ts +11 -0
- package/dist/engine/agent-generator.test.d.ts +0 -2
- package/dist/engine/agent-generator.test.d.ts.map +0 -1
- package/dist/engine/agent-generator.test.js +0 -556
- package/dist/engine/agent-generator.test.js.map +0 -1
- package/dist/engine/analyzer.test.d.ts +0 -2
- package/dist/engine/analyzer.test.d.ts.map +0 -1
- package/dist/engine/analyzer.test.js +0 -1461
- package/dist/engine/analyzer.test.js.map +0 -1
- package/dist/engine/auditor.test.d.ts +0 -2
- package/dist/engine/auditor.test.d.ts.map +0 -1
- package/dist/engine/auditor.test.js +0 -2075
- package/dist/engine/auditor.test.js.map +0 -1
- package/dist/engine/doc-generator.test.d.ts +0 -2
- package/dist/engine/doc-generator.test.d.ts.map +0 -1
- package/dist/engine/doc-generator.test.js +0 -961
- package/dist/engine/doc-generator.test.js.map +0 -1
- package/dist/engine/estimator.test.d.ts +0 -2
- package/dist/engine/estimator.test.d.ts.map +0 -1
- package/dist/engine/estimator.test.js +0 -334
- package/dist/engine/estimator.test.js.map +0 -1
- package/dist/engine/skill-generator.test.d.ts +0 -2
- package/dist/engine/skill-generator.test.d.ts.map +0 -1
- package/dist/engine/skill-generator.test.js +0 -742
- package/dist/engine/skill-generator.test.js.map +0 -1
- package/dist/engine/validator.test.d.ts +0 -2
- package/dist/engine/validator.test.d.ts.map +0 -1
- package/dist/engine/validator.test.js +0 -2371
- package/dist/engine/validator.test.js.map +0 -1
- package/dist/engine/web-fetcher.test.d.ts +0 -2
- package/dist/engine/web-fetcher.test.d.ts.map +0 -1
- package/dist/engine/web-fetcher.test.js +0 -360
- package/dist/engine/web-fetcher.test.js.map +0 -1
- package/dist/i18n/index.test.d.ts +0 -2
- package/dist/i18n/index.test.d.ts.map +0 -1
- package/dist/i18n/index.test.js +0 -375
- package/dist/i18n/index.test.js.map +0 -1
- package/dist/index.test.d.ts +0 -2
- package/dist/index.test.d.ts.map +0 -1
- package/dist/index.test.js +0 -124
- package/dist/index.test.js.map +0 -1
- package/dist/resources/patterns.test.d.ts +0 -2
- package/dist/resources/patterns.test.d.ts.map +0 -1
- package/dist/resources/patterns.test.js +0 -142
- package/dist/resources/patterns.test.js.map +0 -1
- package/dist/resources/process.test.d.ts +0 -2
- package/dist/resources/process.test.d.ts.map +0 -1
- package/dist/resources/process.test.js +0 -48
- package/dist/resources/process.test.js.map +0 -1
- package/dist/resources/registry.test.d.ts +0 -2
- package/dist/resources/registry.test.d.ts.map +0 -1
- package/dist/resources/registry.test.js +0 -138
- package/dist/resources/registry.test.js.map +0 -1
- package/dist/resources/specs.test.d.ts +0 -2
- package/dist/resources/specs.test.d.ts.map +0 -1
- package/dist/resources/specs.test.js +0 -130
- package/dist/resources/specs.test.js.map +0 -1
- package/dist/resources/templates.test.d.ts +0 -2
- package/dist/resources/templates.test.d.ts.map +0 -1
- package/dist/resources/templates.test.js +0 -119
- package/dist/resources/templates.test.js.map +0 -1
- package/dist/smoke.test.d.ts +0 -2
- package/dist/smoke.test.d.ts.map +0 -1
- package/dist/smoke.test.js +0 -229
- package/dist/smoke.test.js.map +0 -1
- package/dist/storage/base-store.test.d.ts +0 -2
- package/dist/storage/base-store.test.d.ts.map +0 -1
- package/dist/storage/base-store.test.js +0 -180
- package/dist/storage/base-store.test.js.map +0 -1
- package/dist/storage/global-store.test.d.ts +0 -2
- package/dist/storage/global-store.test.d.ts.map +0 -1
- package/dist/storage/global-store.test.js +0 -327
- package/dist/storage/global-store.test.js.map +0 -1
- package/dist/storage/index.test.d.ts +0 -2
- package/dist/storage/index.test.d.ts.map +0 -1
- package/dist/storage/index.test.js +0 -56
- package/dist/storage/index.test.js.map +0 -1
- package/dist/storage/knowledge-store.test.d.ts +0 -2
- package/dist/storage/knowledge-store.test.d.ts.map +0 -1
- package/dist/storage/knowledge-store.test.js +0 -368
- package/dist/storage/knowledge-store.test.js.map +0 -1
- package/dist/storage/metrics-store.test.d.ts +0 -2
- package/dist/storage/metrics-store.test.d.ts.map +0 -1
- package/dist/storage/metrics-store.test.js +0 -212
- package/dist/storage/metrics-store.test.js.map +0 -1
- package/dist/storage/pattern-store.test.d.ts +0 -2
- package/dist/storage/pattern-store.test.d.ts.map +0 -1
- package/dist/storage/pattern-store.test.js +0 -224
- package/dist/storage/pattern-store.test.js.map +0 -1
- package/dist/storage/spec-store.test.d.ts +0 -2
- package/dist/storage/spec-store.test.d.ts.map +0 -1
- package/dist/storage/spec-store.test.js +0 -227
- package/dist/storage/spec-store.test.js.map +0 -1
- package/dist/tools/audit.test.d.ts +0 -2
- package/dist/tools/audit.test.d.ts.map +0 -1
- package/dist/tools/audit.test.js +0 -169
- package/dist/tools/audit.test.js.map +0 -1
- package/dist/tools/challenge-spec.test.d.ts +0 -2
- package/dist/tools/challenge-spec.test.d.ts.map +0 -1
- package/dist/tools/challenge-spec.test.js +0 -782
- package/dist/tools/challenge-spec.test.js.map +0 -1
- package/dist/tools/check-versions.test.d.ts +0 -2
- package/dist/tools/check-versions.test.d.ts.map +0 -1
- package/dist/tools/check-versions.test.js +0 -214
- package/dist/tools/check-versions.test.js.map +0 -1
- package/dist/tools/clarify-requirements.test.d.ts +0 -2
- package/dist/tools/clarify-requirements.test.d.ts.map +0 -1
- package/dist/tools/clarify-requirements.test.js +0 -161
- package/dist/tools/clarify-requirements.test.js.map +0 -1
- package/dist/tools/consult-docs.test.d.ts +0 -2
- package/dist/tools/consult-docs.test.d.ts.map +0 -1
- package/dist/tools/consult-docs.test.js +0 -140
- package/dist/tools/consult-docs.test.js.map +0 -1
- package/dist/tools/create-spec.test.d.ts +0 -2
- package/dist/tools/create-spec.test.d.ts.map +0 -1
- package/dist/tools/create-spec.test.js +0 -233
- package/dist/tools/create-spec.test.js.map +0 -1
- package/dist/tools/define-ui-contract.test.d.ts +0 -2
- package/dist/tools/define-ui-contract.test.d.ts.map +0 -1
- package/dist/tools/define-ui-contract.test.js +0 -479
- package/dist/tools/define-ui-contract.test.js.map +0 -1
- package/dist/tools/design-schema.test.d.ts +0 -2
- package/dist/tools/design-schema.test.d.ts.map +0 -1
- package/dist/tools/design-schema.test.js +0 -301
- package/dist/tools/design-schema.test.js.map +0 -1
- package/dist/tools/detect-agent.test.d.ts +0 -2
- package/dist/tools/detect-agent.test.d.ts.map +0 -1
- package/dist/tools/detect-agent.test.js +0 -133
- package/dist/tools/detect-agent.test.js.map +0 -1
- package/dist/tools/detect-drift.test.d.ts +0 -2
- package/dist/tools/detect-drift.test.d.ts.map +0 -1
- package/dist/tools/detect-drift.test.js +0 -312
- package/dist/tools/detect-drift.test.js.map +0 -1
- package/dist/tools/discover-mcps.test.d.ts +0 -2
- package/dist/tools/discover-mcps.test.d.ts.map +0 -1
- package/dist/tools/discover-mcps.test.js +0 -345
- package/dist/tools/discover-mcps.test.js.map +0 -1
- package/dist/tools/estimate.test.d.ts +0 -2
- package/dist/tools/estimate.test.d.ts.map +0 -1
- package/dist/tools/estimate.test.js +0 -137
- package/dist/tools/estimate.test.js.map +0 -1
- package/dist/tools/generate-adr.test.d.ts +0 -2
- package/dist/tools/generate-adr.test.d.ts.map +0 -1
- package/dist/tools/generate-adr.test.js +0 -206
- package/dist/tools/generate-adr.test.js.map +0 -1
- package/dist/tools/generate-checklist.test.d.ts +0 -2
- package/dist/tools/generate-checklist.test.d.ts.map +0 -1
- package/dist/tools/generate-checklist.test.js +0 -201
- package/dist/tools/generate-checklist.test.js.map +0 -1
- package/dist/tools/generate-docs.test.d.ts +0 -2
- package/dist/tools/generate-docs.test.d.ts.map +0 -1
- package/dist/tools/generate-docs.test.js +0 -183
- package/dist/tools/generate-docs.test.js.map +0 -1
- package/dist/tools/generate-execution-plan.test.d.ts +0 -2
- package/dist/tools/generate-execution-plan.test.d.ts.map +0 -1
- package/dist/tools/generate-execution-plan.test.js +0 -643
- package/dist/tools/generate-execution-plan.test.js.map +0 -1
- package/dist/tools/generate-rules.test.d.ts +0 -2
- package/dist/tools/generate-rules.test.d.ts.map +0 -1
- package/dist/tools/generate-rules.test.js +0 -148
- package/dist/tools/generate-rules.test.js.map +0 -1
- package/dist/tools/generate-skill.test.d.ts +0 -2
- package/dist/tools/generate-skill.test.d.ts.map +0 -1
- package/dist/tools/generate-skill.test.js +0 -138
- package/dist/tools/generate-skill.test.js.map +0 -1
- package/dist/tools/generate-sub-agent.test.d.ts +0 -2
- package/dist/tools/generate-sub-agent.test.d.ts.map +0 -1
- package/dist/tools/generate-sub-agent.test.js +0 -162
- package/dist/tools/generate-sub-agent.test.js.map +0 -1
- package/dist/tools/generate-tests.test.d.ts +0 -2
- package/dist/tools/generate-tests.test.d.ts.map +0 -1
- package/dist/tools/generate-tests.test.js +0 -222
- package/dist/tools/generate-tests.test.js.map +0 -1
- package/dist/tools/init-constitution.test.d.ts +0 -2
- package/dist/tools/init-constitution.test.d.ts.map +0 -1
- package/dist/tools/init-constitution.test.js +0 -398
- package/dist/tools/init-constitution.test.js.map +0 -1
- package/dist/tools/init-project.test.d.ts +0 -2
- package/dist/tools/init-project.test.d.ts.map +0 -1
- package/dist/tools/init-project.test.js +0 -158
- package/dist/tools/init-project.test.js.map +0 -1
- package/dist/tools/integrate-pm.test.d.ts +0 -2
- package/dist/tools/integrate-pm.test.d.ts.map +0 -1
- package/dist/tools/integrate-pm.test.js +0 -558
- package/dist/tools/integrate-pm.test.js.map +0 -1
- package/dist/tools/learn.test.d.ts +0 -2
- package/dist/tools/learn.test.d.ts.map +0 -1
- package/dist/tools/learn.test.js +0 -123
- package/dist/tools/learn.test.js.map +0 -1
- package/dist/tools/list-specs.test.d.ts +0 -2
- package/dist/tools/list-specs.test.d.ts.map +0 -1
- package/dist/tools/list-specs.test.js +0 -110
- package/dist/tools/list-specs.test.js.map +0 -1
- package/dist/tools/manage-context.test.d.ts +0 -2
- package/dist/tools/manage-context.test.d.ts.map +0 -1
- package/dist/tools/manage-context.test.js +0 -359
- package/dist/tools/manage-context.test.js.map +0 -1
- package/dist/tools/manage-git.test.d.ts +0 -2
- package/dist/tools/manage-git.test.d.ts.map +0 -1
- package/dist/tools/manage-git.test.js +0 -882
- package/dist/tools/manage-git.test.js.map +0 -1
- package/dist/tools/orchestrate.test.d.ts +0 -2
- package/dist/tools/orchestrate.test.d.ts.map +0 -1
- package/dist/tools/orchestrate.test.js +0 -1117
- package/dist/tools/orchestrate.test.js.map +0 -1
- package/dist/tools/reconcile-spec.test.d.ts +0 -2
- package/dist/tools/reconcile-spec.test.d.ts.map +0 -1
- package/dist/tools/reconcile-spec.test.js +0 -259
- package/dist/tools/reconcile-spec.test.js.map +0 -1
- package/dist/tools/register-platform-tools.test.d.ts +0 -2
- package/dist/tools/register-platform-tools.test.d.ts.map +0 -1
- package/dist/tools/register-platform-tools.test.js +0 -404
- package/dist/tools/register-platform-tools.test.js.map +0 -1
- package/dist/tools/register-spec-tools.test.d.ts +0 -2
- package/dist/tools/register-spec-tools.test.d.ts.map +0 -1
- package/dist/tools/register-spec-tools.test.js +0 -407
- package/dist/tools/register-spec-tools.test.js.map +0 -1
- package/dist/tools/reverse-engineer.test.d.ts +0 -2
- package/dist/tools/reverse-engineer.test.d.ts.map +0 -1
- package/dist/tools/reverse-engineer.test.js +0 -206
- package/dist/tools/reverse-engineer.test.js.map +0 -1
- package/dist/tools/schemas.d.ts +0 -20
- package/dist/tools/schemas.d.ts.map +0 -1
- package/dist/tools/schemas.js +0 -133
- package/dist/tools/schemas.js.map +0 -1
- package/dist/tools/schemas.test.d.ts +0 -2
- package/dist/tools/schemas.test.d.ts.map +0 -1
- package/dist/tools/schemas.test.js +0 -245
- package/dist/tools/schemas.test.js.map +0 -1
- package/dist/tools/set-locale.test.d.ts +0 -2
- package/dist/tools/set-locale.test.d.ts.map +0 -1
- package/dist/tools/set-locale.test.js +0 -74
- package/dist/tools/set-locale.test.js.map +0 -1
- package/dist/tools/suggest-mcps.test.d.ts +0 -2
- package/dist/tools/suggest-mcps.test.d.ts.map +0 -1
- package/dist/tools/suggest-mcps.test.js +0 -198
- package/dist/tools/suggest-mcps.test.js.map +0 -1
- package/dist/tools/suggest-stack.test.d.ts +0 -2
- package/dist/tools/suggest-stack.test.d.ts.map +0 -1
- package/dist/tools/suggest-stack.test.js +0 -181
- package/dist/tools/suggest-stack.test.js.map +0 -1
- package/dist/tools/suggest-tooling.test.d.ts +0 -2
- package/dist/tools/suggest-tooling.test.d.ts.map +0 -1
- package/dist/tools/suggest-tooling.test.js +0 -213
- package/dist/tools/suggest-tooling.test.js.map +0 -1
- package/dist/tools/summarize-spec.test.d.ts +0 -2
- package/dist/tools/summarize-spec.test.d.ts.map +0 -1
- package/dist/tools/summarize-spec.test.js +0 -180
- package/dist/tools/summarize-spec.test.js.map +0 -1
- package/dist/tools/update-status.test.d.ts +0 -2
- package/dist/tools/update-status.test.d.ts.map +0 -1
- package/dist/tools/update-status.test.js +0 -142
- package/dist/tools/update-status.test.js.map +0 -1
- package/dist/tools/validate.test.d.ts +0 -2
- package/dist/tools/validate.test.d.ts.map +0 -1
- package/dist/tools/validate.test.js +0 -137
- 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 +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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pattern-store.test.d.ts","sourceRoot":"","sources":["../../src/storage/pattern-store.test.ts"],"names":[],"mappings":""}
|