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