create-specfuse 0.2.3 → 0.3.1

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 (104) hide show
  1. package/dist/design-md/__tests__/archetype-schema.test.d.ts +2 -0
  2. package/dist/design-md/__tests__/archetype-schema.test.d.ts.map +1 -0
  3. package/dist/design-md/__tests__/archetype-schema.test.js +60 -0
  4. package/dist/design-md/__tests__/archetype-schema.test.js.map +1 -0
  5. package/dist/design-md/__tests__/archetypes.test.d.ts +2 -0
  6. package/dist/design-md/__tests__/archetypes.test.d.ts.map +1 -0
  7. package/dist/design-md/__tests__/archetypes.test.js +45 -0
  8. package/dist/design-md/__tests__/archetypes.test.js.map +1 -0
  9. package/dist/design-md/__tests__/fine-tuner.test.d.ts +2 -0
  10. package/dist/design-md/__tests__/fine-tuner.test.d.ts.map +1 -0
  11. package/dist/design-md/__tests__/fine-tuner.test.js +38 -0
  12. package/dist/design-md/__tests__/fine-tuner.test.js.map +1 -0
  13. package/dist/design-md/__tests__/index.test.d.ts +2 -0
  14. package/dist/design-md/__tests__/index.test.d.ts.map +1 -0
  15. package/dist/design-md/__tests__/index.test.js +66 -0
  16. package/dist/design-md/__tests__/index.test.js.map +1 -0
  17. package/dist/design-md/__tests__/matcher.test.d.ts +2 -0
  18. package/dist/design-md/__tests__/matcher.test.d.ts.map +1 -0
  19. package/dist/design-md/__tests__/matcher.test.js +74 -0
  20. package/dist/design-md/__tests__/matcher.test.js.map +1 -0
  21. package/dist/design-md/__tests__/questionnaire.test.d.ts +2 -0
  22. package/dist/design-md/__tests__/questionnaire.test.d.ts.map +1 -0
  23. package/dist/design-md/__tests__/questionnaire.test.js +57 -0
  24. package/dist/design-md/__tests__/questionnaire.test.js.map +1 -0
  25. package/dist/design-md/__tests__/renderer.test.d.ts +2 -0
  26. package/dist/design-md/__tests__/renderer.test.d.ts.map +1 -0
  27. package/dist/design-md/__tests__/renderer.test.js +51 -0
  28. package/dist/design-md/__tests__/renderer.test.js.map +1 -0
  29. package/dist/design-md/__tests__/types.test.d.ts +2 -0
  30. package/dist/design-md/__tests__/types.test.d.ts.map +1 -0
  31. package/dist/design-md/__tests__/types.test.js +63 -0
  32. package/dist/design-md/__tests__/types.test.js.map +1 -0
  33. package/dist/design-md/archetypes.d.ts +3 -0
  34. package/dist/design-md/archetypes.d.ts.map +1 -0
  35. package/dist/design-md/archetypes.js +18 -0
  36. package/dist/design-md/archetypes.js.map +1 -0
  37. package/dist/design-md/fine-tuner.d.ts +4 -0
  38. package/dist/design-md/fine-tuner.d.ts.map +1 -0
  39. package/dist/design-md/fine-tuner.js +13 -0
  40. package/dist/design-md/fine-tuner.js.map +1 -0
  41. package/dist/design-md/index.d.ts +2 -0
  42. package/dist/design-md/index.d.ts.map +1 -0
  43. package/dist/design-md/index.js +49 -0
  44. package/dist/design-md/index.js.map +1 -0
  45. package/dist/design-md/matcher.d.ts +8 -0
  46. package/dist/design-md/matcher.d.ts.map +1 -0
  47. package/dist/design-md/matcher.js +116 -0
  48. package/dist/design-md/matcher.js.map +1 -0
  49. package/dist/design-md/questionnaire.d.ts +15 -0
  50. package/dist/design-md/questionnaire.d.ts.map +1 -0
  51. package/dist/design-md/questionnaire.js +96 -0
  52. package/dist/design-md/questionnaire.js.map +1 -0
  53. package/dist/design-md/renderer.d.ts +3 -0
  54. package/dist/design-md/renderer.d.ts.map +1 -0
  55. package/dist/design-md/renderer.js +43 -0
  56. package/dist/design-md/renderer.js.map +1 -0
  57. package/dist/design-md/schema.d.ts +69 -0
  58. package/dist/design-md/schema.d.ts.map +1 -0
  59. package/dist/design-md/schema.js +30 -0
  60. package/dist/design-md/schema.js.map +1 -0
  61. package/dist/design-md/templates/_schema.yaml +71 -0
  62. package/dist/design-md/templates/consumer-media.yaml +34 -0
  63. package/dist/design-md/templates/consumer-social.yaml +34 -0
  64. package/dist/design-md/templates/content-blog.yaml +34 -0
  65. package/dist/design-md/templates/content-docs.yaml +34 -0
  66. package/dist/design-md/templates/dashboard-analytics.yaml +34 -0
  67. package/dist/design-md/templates/dashboard-monitoring.yaml +34 -0
  68. package/dist/design-md/templates/developer-portal.yaml +33 -0
  69. package/dist/design-md/templates/e-commerce.yaml +34 -0
  70. package/dist/design-md/templates/form-heavy.yaml +34 -0
  71. package/dist/design-md/templates/internal-tool.yaml +34 -0
  72. package/dist/design-md/templates/marketing-corporate.yaml +34 -0
  73. package/dist/design-md/templates/marketing-creative.yaml +34 -0
  74. package/dist/design-md/templates/mobile-lifestyle.yaml +34 -0
  75. package/dist/design-md/templates/mobile-utility.yaml +33 -0
  76. package/dist/design-md/templates/saas-dashboard.yaml +34 -0
  77. package/dist/design-md/templates/templates/_schema.yaml +71 -0
  78. package/dist/design-md/templates/templates/consumer-media.yaml +34 -0
  79. package/dist/design-md/templates/templates/consumer-social.yaml +34 -0
  80. package/dist/design-md/templates/templates/content-blog.yaml +34 -0
  81. package/dist/design-md/templates/templates/content-docs.yaml +34 -0
  82. package/dist/design-md/templates/templates/dashboard-analytics.yaml +34 -0
  83. package/dist/design-md/templates/templates/dashboard-monitoring.yaml +34 -0
  84. package/dist/design-md/templates/templates/developer-portal.yaml +33 -0
  85. package/dist/design-md/templates/templates/e-commerce.yaml +34 -0
  86. package/dist/design-md/templates/templates/form-heavy.yaml +34 -0
  87. package/dist/design-md/templates/templates/internal-tool.yaml +34 -0
  88. package/dist/design-md/templates/templates/marketing-corporate.yaml +34 -0
  89. package/dist/design-md/templates/templates/marketing-creative.yaml +34 -0
  90. package/dist/design-md/templates/templates/mobile-lifestyle.yaml +34 -0
  91. package/dist/design-md/templates/templates/mobile-utility.yaml +33 -0
  92. package/dist/design-md/templates/templates/saas-dashboard.yaml +34 -0
  93. package/dist/design-md/types.d.ts +33 -0
  94. package/dist/design-md/types.d.ts.map +1 -0
  95. package/dist/design-md/types.js +2 -0
  96. package/dist/design-md/types.js.map +1 -0
  97. package/dist/scaffolder.d.ts.map +1 -1
  98. package/dist/scaffolder.js +10 -0
  99. package/dist/scaffolder.js.map +1 -1
  100. package/dist/templates/design-md-skill.d.ts +2 -0
  101. package/dist/templates/design-md-skill.d.ts.map +1 -0
  102. package/dist/templates/design-md-skill.js +32 -0
  103. package/dist/templates/design-md-skill.js.map +1 -0
  104. package/package.json +2 -2
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=archetype-schema.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archetype-schema.test.d.ts","sourceRoot":"","sources":["../../../src/design-md/__tests__/archetype-schema.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,60 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { readFileSync, readdirSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { parse as parseYaml } from 'yaml';
5
+ import { ArchetypeSchema } from '../schema.js';
6
+ const TEMPLATES_DIR = join(import.meta.dirname, '..', 'templates');
7
+ function loadArchetypeFiles() {
8
+ const files = readdirSync(TEMPLATES_DIR).filter((f) => f.endsWith('.yaml') && !f.startsWith('_'));
9
+ return files.map((f) => ({
10
+ name: f,
11
+ content: parseYaml(readFileSync(join(TEMPLATES_DIR, f), 'utf-8')),
12
+ }));
13
+ }
14
+ describe('archetype schema validation', () => {
15
+ it('_schema.yaml exists and is valid YAML', () => {
16
+ const raw = readFileSync(join(TEMPLATES_DIR, '_schema.yaml'), 'utf-8');
17
+ const schema = parseYaml(raw);
18
+ expect(schema).toHaveProperty('type', 'object');
19
+ expect(schema).toHaveProperty('required');
20
+ });
21
+ it('all archetype YAML files pass schema validation', () => {
22
+ const archetypes = loadArchetypeFiles();
23
+ for (const { name, content } of archetypes) {
24
+ const result = ArchetypeSchema.safeParse(content);
25
+ if (!result.success) {
26
+ throw new Error(`${name} failed validation: ${result.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join(', ')}`);
27
+ }
28
+ }
29
+ });
30
+ it('rejects archetype with missing required field', () => {
31
+ const invalid = { id: 'test', name: 'Test' };
32
+ const result = ArchetypeSchema.safeParse(invalid);
33
+ expect(result.success).toBe(false);
34
+ });
35
+ it('rejects dimension value out of range', () => {
36
+ const invalid = {
37
+ id: 'test',
38
+ name: 'Test',
39
+ category: 'dashboard',
40
+ dimensions: { colorTemp: 6, lightness: 1, density: 1, borderRadius: 1, tone: 1 },
41
+ anchors: { primary: 'X', auxiliary: ['Y'] },
42
+ template: 'x',
43
+ };
44
+ const result = ArchetypeSchema.safeParse(invalid);
45
+ expect(result.success).toBe(false);
46
+ });
47
+ it('rejects invalid category', () => {
48
+ const invalid = {
49
+ id: 'test',
50
+ name: 'Test',
51
+ category: 'unknown-category',
52
+ dimensions: { colorTemp: 1, lightness: 1, density: 1, borderRadius: 1, tone: 1 },
53
+ anchors: { primary: 'X', auxiliary: ['Y'] },
54
+ template: 'x',
55
+ };
56
+ const result = ArchetypeSchema.safeParse(invalid);
57
+ expect(result.success).toBe(false);
58
+ });
59
+ });
60
+ //# sourceMappingURL=archetype-schema.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archetype-schema.test.js","sourceRoot":"","sources":["../../../src/design-md/__tests__/archetype-schema.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=archetypes.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archetypes.test.d.ts","sourceRoot":"","sources":["../../../src/design-md/__tests__/archetypes.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,45 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { loadArchetypes } from '../archetypes.js';
3
+ describe('loadArchetypes()', () => {
4
+ it('returns exactly 15 archetypes', () => {
5
+ const archetypes = loadArchetypes();
6
+ expect(archetypes).toHaveLength(15);
7
+ });
8
+ it('each archetype has valid structure', () => {
9
+ const archetypes = loadArchetypes();
10
+ for (const a of archetypes) {
11
+ expect(a.id).toMatch(/^[a-z][a-z0-9-]*$/);
12
+ expect(a.name).toBeTruthy();
13
+ expect(a.dimensions.colorTemp).toBeGreaterThanOrEqual(1);
14
+ expect(a.dimensions.colorTemp).toBeLessThanOrEqual(5);
15
+ expect(a.anchors.primary).toBeTruthy();
16
+ expect(a.anchors.auxiliary.length).toBeGreaterThanOrEqual(1);
17
+ expect(a.anchors.auxiliary.length).toBeLessThanOrEqual(2);
18
+ expect(a.template).toBeTruthy();
19
+ }
20
+ });
21
+ it('covers all 9 categories', () => {
22
+ const archetypes = loadArchetypes();
23
+ const categories = new Set(archetypes.map((a) => a.category));
24
+ expect(categories).toContain('internal-tool');
25
+ expect(categories).toContain('dashboard');
26
+ expect(categories).toContain('consumer');
27
+ expect(categories).toContain('developer');
28
+ expect(categories).toContain('mobile');
29
+ expect(categories).toContain('e-commerce');
30
+ expect(categories).toContain('marketing');
31
+ expect(categories).toContain('form-heavy');
32
+ expect(categories).toContain('content');
33
+ });
34
+ it('all archetype ids are unique', () => {
35
+ const archetypes = loadArchetypes();
36
+ const ids = archetypes.map((a) => a.id);
37
+ expect(new Set(ids).size).toBe(ids.length);
38
+ });
39
+ it('returns typed Archetype objects', () => {
40
+ const archetypes = loadArchetypes();
41
+ const first = archetypes[0];
42
+ expect(first).toBeDefined();
43
+ });
44
+ });
45
+ //# sourceMappingURL=archetypes.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archetypes.test.js","sourceRoot":"","sources":["../../../src/design-md/__tests__/archetypes.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=fine-tuner.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fine-tuner.test.d.ts","sourceRoot":"","sources":["../../../src/design-md/__tests__/fine-tuner.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,38 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { applyOverrides } from '../fine-tuner.js';
3
+ const baseVector = {
4
+ colorTemp: 2,
5
+ lightness: 3,
6
+ density: 2,
7
+ borderRadius: 3,
8
+ tone: 2,
9
+ };
10
+ describe('applyOverrides()', () => {
11
+ it('returns original vector when no overrides', () => {
12
+ const result = applyOverrides(baseVector, {});
13
+ expect(result).toEqual(baseVector);
14
+ });
15
+ it('applies single dimension override', () => {
16
+ const result = applyOverrides(baseVector, { borderRadius: 1 });
17
+ expect(result).toEqual({ ...baseVector, borderRadius: 1 });
18
+ });
19
+ it('applies multiple dimension overrides', () => {
20
+ const result = applyOverrides(baseVector, { colorTemp: 5, tone: 4 });
21
+ expect(result).toEqual({ ...baseVector, colorTemp: 5, tone: 4 });
22
+ });
23
+ it('rejects values below 1', () => {
24
+ expect(() => applyOverrides(baseVector, { colorTemp: 0 })).toThrow();
25
+ });
26
+ it('rejects values above 5', () => {
27
+ expect(() => applyOverrides(baseVector, { density: 6 })).toThrow();
28
+ });
29
+ it('rejects non-integer values', () => {
30
+ expect(() => applyOverrides(baseVector, { tone: 2.5 })).toThrow();
31
+ });
32
+ it('does not mutate the original vector', () => {
33
+ const original = { ...baseVector };
34
+ applyOverrides(baseVector, { colorTemp: 5 });
35
+ expect(baseVector).toEqual(original);
36
+ });
37
+ });
38
+ //# sourceMappingURL=fine-tuner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fine-tuner.test.js","sourceRoot":"","sources":["../../../src/design-md/__tests__/fine-tuner.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,MAAM,UAAU,GAAoB;IAClC,SAAS,EAAE,CAAC;IACZ,SAAS,EAAE,CAAC;IACZ,OAAO,EAAE,CAAC;IACV,YAAY,EAAE,CAAC;IACf,IAAI,EAAE,CAAC;CACR,CAAC;AAEF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,UAAU,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACrE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,UAAU,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,CAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,CAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,GAAU,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,QAAQ,GAAG,EAAE,GAAG,UAAU,EAAE,CAAC;QACnC,cAAc,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7C,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../../src/design-md/__tests__/index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,66 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { mkdtempSync, readFileSync, writeFileSync, existsSync, rmSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { tmpdir } from 'node:os';
5
+ vi.mock('@inquirer/prompts', () => ({
6
+ checkbox: vi.fn(),
7
+ select: vi.fn(),
8
+ input: vi.fn(),
9
+ confirm: vi.fn(),
10
+ number: vi.fn(),
11
+ }));
12
+ describe('generateDesignMd()', () => {
13
+ let tempDir;
14
+ beforeEach(() => {
15
+ tempDir = mkdtempSync(join(tmpdir(), 'design-md-test-'));
16
+ });
17
+ afterEach(() => {
18
+ rmSync(tempDir, { recursive: true, force: true });
19
+ vi.resetAllMocks();
20
+ vi.resetModules();
21
+ });
22
+ it('writes DESIGN.md to target directory', async () => {
23
+ const { checkbox, select, input, confirm } = await import('@inquirer/prompts');
24
+ checkbox.mockResolvedValue(['dashboard', 'internal-tool']);
25
+ select.mockResolvedValueOnce('developers'); // audience
26
+ select.mockResolvedValueOnce('dark'); // mood
27
+ select.mockResolvedValueOnce('compact'); // density
28
+ input.mockResolvedValue(''); // reference
29
+ confirm.mockResolvedValue(true); // confirm match
30
+ select.mockResolvedValueOnce('accept'); // fine-tune action
31
+ const { generateDesignMd } = await import('../index.js');
32
+ const result = await generateDesignMd(tempDir);
33
+ expect(result).toBe(join(tempDir, 'DESIGN.md'));
34
+ expect(existsSync(join(tempDir, 'DESIGN.md'))).toBe(true);
35
+ const content = readFileSync(join(tempDir, 'DESIGN.md'), 'utf-8');
36
+ expect(content).toContain('---');
37
+ expect(content).toContain('tokens');
38
+ });
39
+ it('returns null when user declines overwrite', async () => {
40
+ writeFileSync(join(tempDir, 'DESIGN.md'), 'existing content');
41
+ const { checkbox, select, input, confirm } = await import('@inquirer/prompts');
42
+ confirm.mockResolvedValue(false); // decline overwrite
43
+ const { generateDesignMd } = await import('../index.js');
44
+ const result = await generateDesignMd(tempDir);
45
+ expect(result).toBeNull();
46
+ expect(readFileSync(join(tempDir, 'DESIGN.md'), 'utf-8')).toBe('existing content');
47
+ });
48
+ it('creates backup when overwriting existing DESIGN.md', async () => {
49
+ writeFileSync(join(tempDir, 'DESIGN.md'), 'old content');
50
+ const { checkbox, select, input, confirm } = await import('@inquirer/prompts');
51
+ confirm.mockResolvedValueOnce(true); // confirm overwrite
52
+ checkbox.mockResolvedValue(['consumer']);
53
+ select.mockResolvedValueOnce('general'); // audience
54
+ select.mockResolvedValueOnce('playful'); // mood
55
+ select.mockResolvedValueOnce('spacious'); // density
56
+ input.mockResolvedValue(''); // reference
57
+ confirm.mockResolvedValueOnce(true); // confirm match
58
+ select.mockResolvedValueOnce('accept'); // fine-tune action
59
+ const { generateDesignMd } = await import('../index.js');
60
+ const result = await generateDesignMd(tempDir);
61
+ expect(result).toBe(join(tempDir, 'DESIGN.md'));
62
+ expect(existsSync(join(tempDir, 'DESIGN.md.bak'))).toBe(true);
63
+ expect(readFileSync(join(tempDir, 'DESIGN.md.bak'), 'utf-8')).toBe('old content');
64
+ });
65
+ });
66
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../src/design-md/__tests__/index.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=matcher.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matcher.test.d.ts","sourceRoot":"","sources":["../../../src/design-md/__tests__/matcher.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,74 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { deriveVector, matchArchetype } from '../matcher.js';
3
+ const sampleAnswers = {
4
+ productType: ['dashboard', 'internal-tool'],
5
+ audience: 'developers',
6
+ mood: 'dark',
7
+ density: 'compact',
8
+ reference: null,
9
+ };
10
+ describe('deriveVector()', () => {
11
+ it('returns a valid DimensionVector with values 1-5', () => {
12
+ const vec = deriveVector(sampleAnswers);
13
+ for (const key of ['colorTemp', 'lightness', 'density', 'borderRadius', 'tone']) {
14
+ expect(vec[key]).toBeGreaterThanOrEqual(1);
15
+ expect(vec[key]).toBeLessThanOrEqual(5);
16
+ expect(Number.isInteger(vec[key])).toBe(true);
17
+ }
18
+ });
19
+ it('same input produces same output (deterministic)', () => {
20
+ const a = deriveVector(sampleAnswers);
21
+ const b = deriveVector(sampleAnswers);
22
+ expect(a).toEqual(b);
23
+ });
24
+ it('different inputs produce different vectors', () => {
25
+ const other = {
26
+ productType: ['marketing'],
27
+ audience: 'general',
28
+ mood: 'playful',
29
+ density: 'spacious',
30
+ reference: null,
31
+ };
32
+ const a = deriveVector(sampleAnswers);
33
+ const b = deriveVector(other);
34
+ expect(a).not.toEqual(b);
35
+ });
36
+ });
37
+ describe('matchArchetype()', () => {
38
+ it('returns all 15 archetypes ranked', () => {
39
+ const results = matchArchetype(sampleAnswers);
40
+ expect(results).toHaveLength(15);
41
+ });
42
+ it('results are sorted by ascending distance (best first)', () => {
43
+ const results = matchArchetype(sampleAnswers);
44
+ for (let i = 1; i < results.length; i++) {
45
+ expect(results[i].distance).toBeGreaterThanOrEqual(results[i - 1].distance);
46
+ }
47
+ });
48
+ it('category bonus applied to matching categories', () => {
49
+ const dashboardAnswers = {
50
+ productType: ['dashboard'],
51
+ audience: 'business',
52
+ mood: 'serious',
53
+ density: 'compact',
54
+ reference: null,
55
+ };
56
+ const results = matchArchetype(dashboardAnswers);
57
+ const dashboardResults = results.filter((r) => r.archetype.category === 'dashboard');
58
+ expect(dashboardResults.length).toBeGreaterThan(0);
59
+ // dashboard archetypes should rank highly for dashboard-focused answers
60
+ const topIds = results.slice(0, 5).map((r) => r.archetype.id);
61
+ const hasDashboard = topIds.some((id) => id.includes('dashboard') || id.includes('monitoring') || id.includes('analytics'));
62
+ expect(hasDashboard).toBe(true);
63
+ });
64
+ it('each result has archetype and distance', () => {
65
+ const results = matchArchetype(sampleAnswers);
66
+ for (const r of results) {
67
+ expect(r.archetype).toBeDefined();
68
+ expect(r.archetype.id).toBeTruthy();
69
+ expect(typeof r.distance).toBe('number');
70
+ expect(r.distance).toBeGreaterThanOrEqual(0);
71
+ }
72
+ });
73
+ });
74
+ //# sourceMappingURL=matcher.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matcher.test.js","sourceRoot":"","sources":["../../../src/design-md/__tests__/matcher.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG7D,MAAM,aAAa,GAAyB;IAC1C,WAAW,EAAE,CAAC,WAAW,EAAE,eAAe,CAAC;IAC3C,QAAQ,EAAE,YAAY;IACtB,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,IAAI;CAChB,CAAC;AAEF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,GAAG,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;QACxC,KAAK,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,CAAU,EAAE,CAAC;YACzF,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;QACtC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,KAAK,GAAyB;YAClC,WAAW,EAAE,CAAC,WAAW,CAAC;YAC1B,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,UAAU;YACnB,SAAS,EAAE,IAAI;SAChB,CAAC;QACF,MAAM,CAAC,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,OAAO,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;QAC9C,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,OAAO,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;QAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,gBAAgB,GAAyB;YAC7C,WAAW,EAAE,CAAC,WAAW,CAAC;YAC1B,QAAQ,EAAE,UAAU;YACpB,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,SAAS;YAClB,SAAS,EAAE,IAAI;SAChB,CAAC;QACF,MAAM,OAAO,GAAG,cAAc,CAAC,gBAAgB,CAAC,CAAC;QACjD,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,KAAK,WAAW,CAAC,CAAC;QACrF,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACnD,wEAAwE;QACxE,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC9D,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAC9B,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC1F,CAAC;QACF,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,OAAO,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;QAC9C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;YAClC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;YACpC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=questionnaire.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"questionnaire.test.d.ts","sourceRoot":"","sources":["../../../src/design-md/__tests__/questionnaire.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,57 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { QUESTIONS, } from '../questionnaire.js';
3
+ describe('questionnaire definitions', () => {
4
+ it('exports exactly 5 questions (Q1-Q5)', () => {
5
+ expect(QUESTIONS).toHaveLength(5);
6
+ });
7
+ it('Q1 is multi-select product type', () => {
8
+ const q1 = QUESTIONS[0];
9
+ expect(q1.id).toBe('productType');
10
+ expect(q1.type).toBe('checkbox');
11
+ expect(q1.choices.length).toBeGreaterThanOrEqual(9);
12
+ });
13
+ it('Q2 is single-select audience', () => {
14
+ const q2 = QUESTIONS[1];
15
+ expect(q2.id).toBe('audience');
16
+ expect(q2.type).toBe('select');
17
+ expect(q2.choices.length).toBeGreaterThanOrEqual(3);
18
+ });
19
+ it('Q3 is multi-select mood keywords', () => {
20
+ const q3 = QUESTIONS[2];
21
+ expect(q3.id).toBe('mood');
22
+ expect(q3.type).toBe('checkbox');
23
+ expect(q3.choices.length).toBeGreaterThanOrEqual(4);
24
+ });
25
+ it('Q4 is single-select density preference', () => {
26
+ const q4 = QUESTIONS[3];
27
+ expect(q4.id).toBe('density');
28
+ expect(q4.type).toBe('select');
29
+ expect(q4.choices.length).toBeGreaterThanOrEqual(3);
30
+ });
31
+ it('Q5 is optional text input for reference product', () => {
32
+ const q5 = QUESTIONS[4];
33
+ expect(q5.id).toBe('reference');
34
+ expect(q5.type).toBe('input');
35
+ expect(q5.required).toBe(false);
36
+ });
37
+ it('all questions have message and id', () => {
38
+ for (const q of QUESTIONS) {
39
+ expect(q.id).toBeTruthy();
40
+ expect(q.message).toBeTruthy();
41
+ }
42
+ });
43
+ it('Q1 choices cover all archetype categories', () => {
44
+ const q1 = QUESTIONS[0];
45
+ const values = q1.choices.map((c) => c.value);
46
+ expect(values).toContain('internal-tool');
47
+ expect(values).toContain('dashboard');
48
+ expect(values).toContain('consumer');
49
+ expect(values).toContain('developer');
50
+ expect(values).toContain('mobile');
51
+ expect(values).toContain('e-commerce');
52
+ expect(values).toContain('marketing');
53
+ expect(values).toContain('form-heavy');
54
+ expect(values).toContain('content');
55
+ });
56
+ });
57
+ //# sourceMappingURL=questionnaire.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"questionnaire.test.js","sourceRoot":"","sources":["../../../src/design-md/__tests__/questionnaire.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=renderer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.test.d.ts","sourceRoot":"","sources":["../../../src/design-md/__tests__/renderer.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,51 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { renderDesignMd } from '../renderer.js';
3
+ import { loadArchetypes } from '../archetypes.js';
4
+ import { parse as parseYaml } from 'yaml';
5
+ const archetypes = loadArchetypes();
6
+ const testArchetype = archetypes[0];
7
+ const testVector = { colorTemp: 2, lightness: 3, density: 2, borderRadius: 3, tone: 2 };
8
+ describe('renderDesignMd()', () => {
9
+ it('output starts and ends YAML front matter with --- delimiters', () => {
10
+ const output = renderDesignMd(testArchetype, testVector);
11
+ const lines = output.split('\n');
12
+ expect(lines[0]).toBe('---');
13
+ const secondDelimiter = lines.indexOf('---', 1);
14
+ expect(secondDelimiter).toBeGreaterThan(1);
15
+ });
16
+ it('YAML front matter contains tokens key', () => {
17
+ const output = renderDesignMd(testArchetype, testVector);
18
+ const yamlBlock = output.split('---')[1];
19
+ const parsed = parseYaml(yamlBlock);
20
+ expect(parsed).toHaveProperty('tokens');
21
+ });
22
+ it('YAML front matter contains archetype metadata', () => {
23
+ const output = renderDesignMd(testArchetype, testVector);
24
+ const yamlBlock = output.split('---')[1];
25
+ const parsed = parseYaml(yamlBlock);
26
+ expect(parsed).toHaveProperty('archetype');
27
+ expect(parsed.archetype).toBe(testArchetype.id);
28
+ });
29
+ it('YAML front matter contains dimensions', () => {
30
+ const output = renderDesignMd(testArchetype, testVector);
31
+ const yamlBlock = output.split('---')[1];
32
+ const parsed = parseYaml(yamlBlock);
33
+ expect(parsed).toHaveProperty('dimensions');
34
+ expect(parsed.dimensions).toEqual(testVector);
35
+ });
36
+ it('markdown body contains required sections', () => {
37
+ const output = renderDesignMd(testArchetype, testVector);
38
+ const parts = output.split('---');
39
+ const markdown = parts.slice(2).join('---');
40
+ expect(markdown).toContain('# Style Direction');
41
+ expect(markdown).toContain('## Color Palette');
42
+ expect(markdown).toContain('## Typography');
43
+ expect(markdown).toContain('## Spacing');
44
+ expect(markdown).toContain('## Components');
45
+ });
46
+ it('output is valid non-empty string', () => {
47
+ const output = renderDesignMd(testArchetype, testVector);
48
+ expect(output.length).toBeGreaterThan(100);
49
+ });
50
+ });
51
+ //# sourceMappingURL=renderer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.test.js","sourceRoot":"","sources":["../../../src/design-md/__tests__/renderer.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.test.d.ts","sourceRoot":"","sources":["../../../src/design-md/__tests__/types.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,63 @@
1
+ import { describe, it, expectTypeOf } from 'vitest';
2
+ describe('DimensionVector type constraints', () => {
3
+ it('accepts valid dimension values (1-5)', () => {
4
+ const v = {
5
+ colorTemp: 1,
6
+ lightness: 2,
7
+ density: 3,
8
+ borderRadius: 4,
9
+ tone: 5,
10
+ };
11
+ expectTypeOf(v.colorTemp).toEqualTypeOf();
12
+ expectTypeOf(v.lightness).toEqualTypeOf();
13
+ expectTypeOf(v.density).toEqualTypeOf();
14
+ expectTypeOf(v.borderRadius).toEqualTypeOf();
15
+ expectTypeOf(v.tone).toEqualTypeOf();
16
+ });
17
+ it('has exactly 5 dimension keys', () => {
18
+ expectTypeOf().toEqualTypeOf();
19
+ });
20
+ });
21
+ describe('ArchetypeCategory type constraints', () => {
22
+ it('is an exhaustive union of 9 categories', () => {
23
+ expectTypeOf().toEqualTypeOf();
24
+ });
25
+ });
26
+ describe('Archetype type structure', () => {
27
+ it('has required fields with correct types', () => {
28
+ expectTypeOf().toHaveProperty('id');
29
+ expectTypeOf().toHaveProperty('name');
30
+ expectTypeOf().toHaveProperty('category');
31
+ expectTypeOf().toHaveProperty('dimensions');
32
+ expectTypeOf().toHaveProperty('anchors');
33
+ expectTypeOf().toHaveProperty('template');
34
+ expectTypeOf().toBeString();
35
+ expectTypeOf().toBeString();
36
+ expectTypeOf().toEqualTypeOf();
37
+ expectTypeOf().toEqualTypeOf();
38
+ expectTypeOf().toBeString();
39
+ });
40
+ it('anchors has primary and auxiliary fields', () => {
41
+ expectTypeOf().toEqualTypeOf();
42
+ });
43
+ });
44
+ describe('QuestionnaireAnswers type structure', () => {
45
+ it('has correct field types', () => {
46
+ expectTypeOf().toEqualTypeOf();
47
+ expectTypeOf().toBeString();
48
+ expectTypeOf().toBeString();
49
+ expectTypeOf().toBeString();
50
+ expectTypeOf().toEqualTypeOf();
51
+ });
52
+ });
53
+ describe('DesignMdConfig type structure', () => {
54
+ it('has archetype and vector fields', () => {
55
+ expectTypeOf().toHaveProperty('archetype');
56
+ expectTypeOf().toHaveProperty('finalVector');
57
+ expectTypeOf().toHaveProperty('answers');
58
+ expectTypeOf().toEqualTypeOf();
59
+ expectTypeOf().toEqualTypeOf();
60
+ expectTypeOf().toEqualTypeOf();
61
+ });
62
+ });
63
+ //# sourceMappingURL=types.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.test.js","sourceRoot":"","sources":["../../../src/design-md/__tests__/types.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AASpD,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,GAAoB;YACzB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC;YACV,YAAY,EAAE,CAAC;YACf,IAAI,EAAE,CAAC;SACR,CAAC;QACF,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,aAAa,EAAqB,CAAC;QAC7D,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,aAAa,EAAqB,CAAC;QAC7D,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,EAAqB,CAAC;QAC3D,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,aAAa,EAAqB,CAAC;QAChE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAqB,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,YAAY,EAAyB,CAAC,aAAa,EAEhD,CAAC;IACN,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAClD,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,YAAY,EAAqB,CAAC,aAAa,EAU5C,CAAC;IACN,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,YAAY,EAAa,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC/C,YAAY,EAAa,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACjD,YAAY,EAAa,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QACrD,YAAY,EAAa,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QACvD,YAAY,EAAa,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACpD,YAAY,EAAa,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAErD,YAAY,EAAmB,CAAC,UAAU,EAAE,CAAC;QAC7C,YAAY,EAAqB,CAAC,UAAU,EAAE,CAAC;QAC/C,YAAY,EAAyB,CAAC,aAAa,EAAqB,CAAC;QACzE,YAAY,EAA2B,CAAC,aAAa,EAAmB,CAAC;QACzE,YAAY,EAAyB,CAAC,UAAU,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,YAAY,EAAwB,CAAC,aAAa,EAG9C,CAAC;IACP,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACnD,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,YAAY,EAAuC,CAAC,aAAa,EAAY,CAAC;QAC9E,YAAY,EAAoC,CAAC,UAAU,EAAE,CAAC;QAC9D,YAAY,EAAgC,CAAC,UAAU,EAAE,CAAC;QAC1D,YAAY,EAAmC,CAAC,UAAU,EAAE,CAAC;QAC7D,YAAY,EAAqC,CAAC,aAAa,EAAiB,CAAC;IACnF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,YAAY,EAAkB,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAC3D,YAAY,EAAkB,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;QAC7D,YAAY,EAAkB,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAEzD,YAAY,EAA+B,CAAC,aAAa,EAAa,CAAC;QACvE,YAAY,EAAiC,CAAC,aAAa,EAAmB,CAAC;QAC/E,YAAY,EAA6B,CAAC,aAAa,EAAwB,CAAC;IAClF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Archetype } from './types.js';
2
+ export declare function loadArchetypes(): Archetype[];
3
+ //# sourceMappingURL=archetypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archetypes.d.ts","sourceRoot":"","sources":["../../src/design-md/archetypes.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAI5C,wBAAgB,cAAc,IAAI,SAAS,EAAE,CAgB5C"}
@@ -0,0 +1,18 @@
1
+ import { readFileSync, readdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { parse as parseYaml } from 'yaml';
4
+ import { ArchetypeSchema } from './schema.js';
5
+ const TEMPLATES_DIR = join(import.meta.dirname, 'templates');
6
+ export function loadArchetypes() {
7
+ const files = readdirSync(TEMPLATES_DIR).filter((f) => f.endsWith('.yaml') && !f.startsWith('_'));
8
+ return files.map((f) => {
9
+ const raw = readFileSync(join(TEMPLATES_DIR, f), 'utf-8');
10
+ const parsed = parseYaml(raw);
11
+ const result = ArchetypeSchema.safeParse(parsed);
12
+ if (!result.success) {
13
+ throw new Error(`Invalid archetype ${f}: ${result.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join(', ')}`);
14
+ }
15
+ return result.data;
16
+ });
17
+ }
18
+ //# sourceMappingURL=archetypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archetypes.js","sourceRoot":"","sources":["../../src/design-md/archetypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AAE7D,MAAM,UAAU,cAAc;IAC5B,MAAM,KAAK,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC,MAAM,CAC7C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CACjD,CAAC;IAEF,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACrB,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,qBAAqB,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC5G,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC,IAAiB,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { DimensionVector } from './types.js';
2
+ export type DimensionOverrides = Partial<Record<keyof DimensionVector, number>>;
3
+ export declare function applyOverrides(base: DimensionVector, overrides: DimensionOverrides): DimensionVector;
4
+ //# sourceMappingURL=fine-tuner.d.ts.map