create-specfuse 0.2.3 → 0.3.0

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 (72) 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/types.d.ts +33 -0
  62. package/dist/design-md/types.d.ts.map +1 -0
  63. package/dist/design-md/types.js +2 -0
  64. package/dist/design-md/types.js.map +1 -0
  65. package/dist/scaffolder.d.ts.map +1 -1
  66. package/dist/scaffolder.js +10 -0
  67. package/dist/scaffolder.js.map +1 -1
  68. package/dist/templates/design-md-skill.d.ts +2 -0
  69. package/dist/templates/design-md-skill.d.ts.map +1 -0
  70. package/dist/templates/design-md-skill.js +32 -0
  71. package/dist/templates/design-md-skill.js.map +1 -0
  72. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fine-tuner.d.ts","sourceRoot":"","sources":["../../src/design-md/fine-tuner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,eAAe,EAAE,MAAM,YAAY,CAAC;AAElE,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;AAEhF,wBAAgB,cAAc,CAAC,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,kBAAkB,GAAG,eAAe,CAYpG"}
@@ -0,0 +1,13 @@
1
+ export function applyOverrides(base, overrides) {
2
+ const result = { ...base };
3
+ for (const [key, value] of Object.entries(overrides)) {
4
+ if (value === undefined)
5
+ continue;
6
+ if (!Number.isInteger(value) || value < 1 || value > 5) {
7
+ throw new Error(`Invalid dimension value for ${key}: ${value} (must be integer 1-5)`);
8
+ }
9
+ result[key] = value;
10
+ }
11
+ return result;
12
+ }
13
+ //# sourceMappingURL=fine-tuner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fine-tuner.js","sourceRoot":"","sources":["../../src/design-md/fine-tuner.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,cAAc,CAAC,IAAqB,EAAE,SAA6B;IACjF,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;IAE3B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,KAAK,KAAK,wBAAwB,CAAC,CAAC;QACxF,CAAC;QACD,MAAM,CAAC,GAA4B,CAAC,GAAG,KAAuB,CAAC;IACjE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function generateDesignMd(targetDir: string): Promise<string | null>;
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/design-md/index.ts"],"names":[],"mappings":"AASA,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+ChF"}
@@ -0,0 +1,49 @@
1
+ import { existsSync, writeFileSync, copyFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { runQuestionnaire } from './questionnaire.js';
4
+ import { matchArchetype } from './matcher.js';
5
+ import { deriveVector } from './matcher.js';
6
+ import { applyOverrides } from './fine-tuner.js';
7
+ import { renderDesignMd } from './renderer.js';
8
+ export async function generateDesignMd(targetDir) {
9
+ const { confirm, select, number } = await import('@inquirer/prompts');
10
+ const outputPath = join(targetDir, 'DESIGN.md');
11
+ if (existsSync(outputPath)) {
12
+ const overwrite = await confirm({ message: 'DESIGN.md already exists. Overwrite?' });
13
+ if (!overwrite)
14
+ return null;
15
+ copyFileSync(outputPath, join(targetDir, 'DESIGN.md.bak'));
16
+ }
17
+ const answers = await runQuestionnaire();
18
+ const results = matchArchetype(answers);
19
+ const top = results[0];
20
+ const accepted = await confirm({
21
+ message: `Best match: ${top.archetype.name} (distance: ${top.distance.toFixed(2)}). Accept?`,
22
+ });
23
+ if (!accepted)
24
+ return null;
25
+ const baseVector = deriveVector(answers);
26
+ const action = await select({
27
+ message: 'Fine-tune dimensions?',
28
+ choices: [
29
+ { value: 'accept', name: 'Accept as-is' },
30
+ { value: 'tune', name: 'Adjust dimensions manually' },
31
+ ],
32
+ });
33
+ let finalVector = baseVector;
34
+ if (action === 'tune') {
35
+ const overrides = {};
36
+ for (const key of Object.keys(baseVector)) {
37
+ const val = await number({
38
+ message: `${key} (current: ${baseVector[key]}, 1-5, Enter to keep):`,
39
+ });
40
+ if (val !== undefined)
41
+ overrides[key] = val;
42
+ }
43
+ finalVector = applyOverrides(baseVector, overrides);
44
+ }
45
+ const content = renderDesignMd(top.archetype, finalVector);
46
+ writeFileSync(outputPath, content, 'utf-8');
47
+ return outputPath;
48
+ }
49
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/design-md/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,cAAc,EAA2B,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,SAAiB;IACtD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAEhD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,EAAE,OAAO,EAAE,sCAAsC,EAAE,CAAC,CAAC;QACrF,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAC5B,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAEvB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;QAC7B,OAAO,EAAE,eAAe,GAAG,CAAC,SAAS,CAAC,IAAI,eAAe,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY;KAC7F,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAEzC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;QAC1B,OAAO,EAAE,uBAAuB;QAChC,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE;YACzC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE;SACtD;KACF,CAAC,CAAC;IAEH,IAAI,WAAW,GAAoB,UAAU,CAAC;IAE9C,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,MAAM,SAAS,GAAuB,EAAE,CAAC;QACzC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAA8B,EAAE,CAAC;YACvE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC;gBACvB,OAAO,EAAE,GAAG,GAAG,cAAc,UAAU,CAAC,GAAG,CAAC,wBAAwB;aACrE,CAAC,CAAC;YACH,IAAI,GAAG,KAAK,SAAS;gBAAE,SAAS,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;QAC9C,CAAC;QACD,WAAW,GAAG,cAAc,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC3D,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAE5C,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { Archetype, DimensionVector, QuestionnaireAnswers } from './types.js';
2
+ export interface MatchResult {
3
+ archetype: Archetype;
4
+ distance: number;
5
+ }
6
+ export declare function deriveVector(answers: QuestionnaireAnswers): DimensionVector;
7
+ export declare function matchArchetype(answers: QuestionnaireAnswers): MatchResult[];
8
+ //# sourceMappingURL=matcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matcher.d.ts","sourceRoot":"","sources":["../../src/design-md/matcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAkB,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEnG,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AA2CD,wBAAgB,YAAY,CAAC,OAAO,EAAE,oBAAoB,GAAG,eAAe,CA4D3E;AAYD,wBAAgB,cAAc,CAAC,OAAO,EAAE,oBAAoB,GAAG,WAAW,EAAE,CAe3E"}
@@ -0,0 +1,116 @@
1
+ import { loadArchetypes } from './archetypes.js';
2
+ const MOOD_MAP = {
3
+ clean: { lightness: 4, tone: 2 },
4
+ playful: { colorTemp: 4, tone: 5, borderRadius: 4 },
5
+ serious: { colorTemp: 2, tone: 1, borderRadius: 2 },
6
+ warm: { colorTemp: 4, lightness: 3, tone: 3 },
7
+ bold: { colorTemp: 3, tone: 4, lightness: 2 },
8
+ calm: { colorTemp: 3, lightness: 4, tone: 2 },
9
+ dark: { colorTemp: 1, lightness: 1, tone: 1 },
10
+ luxurious: { colorTemp: 3, lightness: 2, borderRadius: 3, tone: 3 },
11
+ };
12
+ const AUDIENCE_MAP = {
13
+ developers: { density: 1, borderRadius: 2, tone: 1 },
14
+ business: { density: 2, tone: 2, lightness: 3 },
15
+ general: { density: 3, borderRadius: 4, tone: 4 },
16
+ designers: { lightness: 4, borderRadius: 4, tone: 3 },
17
+ enterprise: { density: 2, tone: 1, borderRadius: 2 },
18
+ };
19
+ const DENSITY_MAP = {
20
+ compact: 1,
21
+ balanced: 3,
22
+ spacious: 5,
23
+ };
24
+ const CATEGORY_MAP = {
25
+ 'internal-tool': { colorTemp: 2, lightness: 3, density: 1, borderRadius: 2, tone: 1 },
26
+ dashboard: { colorTemp: 1, lightness: 1, density: 1, borderRadius: 2, tone: 1 },
27
+ consumer: { colorTemp: 4, lightness: 4, density: 3, borderRadius: 4, tone: 4 },
28
+ developer: { colorTemp: 2, lightness: 2, density: 2, borderRadius: 2, tone: 1 },
29
+ mobile: { colorTemp: 3, lightness: 4, density: 3, borderRadius: 5, tone: 4 },
30
+ 'e-commerce': { colorTemp: 3, lightness: 4, density: 2, borderRadius: 3, tone: 3 },
31
+ marketing: { colorTemp: 4, lightness: 4, density: 4, borderRadius: 4, tone: 5 },
32
+ 'form-heavy': { colorTemp: 2, lightness: 3, density: 2, borderRadius: 2, tone: 2 },
33
+ content: { colorTemp: 3, lightness: 4, density: 3, borderRadius: 3, tone: 3 },
34
+ };
35
+ function clamp(val) {
36
+ return Math.max(1, Math.min(5, Math.round(val)));
37
+ }
38
+ export function deriveVector(answers) {
39
+ const accumulator = { colorTemp: 0, lightness: 0, density: 0, borderRadius: 0, tone: 0 };
40
+ const weights = { colorTemp: 0, lightness: 0, density: 0, borderRadius: 0, tone: 0 };
41
+ // Q1: product type (primary 0.7, secondary 0.3)
42
+ const primary = answers.productType[0];
43
+ const secondaries = answers.productType.slice(1);
44
+ const primaryVec = CATEGORY_MAP[primary];
45
+ if (primaryVec) {
46
+ for (const [k, v] of Object.entries(primaryVec)) {
47
+ const key = k;
48
+ accumulator[key] += v * 0.7;
49
+ weights[key] += 0.7;
50
+ }
51
+ }
52
+ const secWeight = secondaries.length > 0 ? 0.3 / secondaries.length : 0;
53
+ for (const sec of secondaries) {
54
+ const secVec = CATEGORY_MAP[sec];
55
+ if (secVec) {
56
+ for (const [k, v] of Object.entries(secVec)) {
57
+ const key = k;
58
+ accumulator[key] += v * secWeight;
59
+ weights[key] += secWeight;
60
+ }
61
+ }
62
+ }
63
+ // Q2: audience
64
+ const audienceVec = AUDIENCE_MAP[answers.audience];
65
+ if (audienceVec) {
66
+ for (const [k, v] of Object.entries(audienceVec)) {
67
+ const key = k;
68
+ accumulator[key] += v * 0.5;
69
+ weights[key] += 0.5;
70
+ }
71
+ }
72
+ // Q3: mood
73
+ const moodVec = MOOD_MAP[answers.mood];
74
+ if (moodVec) {
75
+ for (const [k, v] of Object.entries(moodVec)) {
76
+ const key = k;
77
+ accumulator[key] += v * 0.6;
78
+ weights[key] += 0.6;
79
+ }
80
+ }
81
+ // Q4: density (direct mapping)
82
+ const densityVal = DENSITY_MAP[answers.density] ?? 3;
83
+ accumulator.density += densityVal * 0.8;
84
+ weights.density += 0.8;
85
+ // Compute weighted average for each dimension
86
+ return {
87
+ colorTemp: clamp(weights.colorTemp > 0 ? accumulator.colorTemp / weights.colorTemp : 3),
88
+ lightness: clamp(weights.lightness > 0 ? accumulator.lightness / weights.lightness : 3),
89
+ density: clamp(weights.density > 0 ? accumulator.density / weights.density : 3),
90
+ borderRadius: clamp(weights.borderRadius > 0 ? accumulator.borderRadius / weights.borderRadius : 3),
91
+ tone: clamp(weights.tone > 0 ? accumulator.tone / weights.tone : 3),
92
+ };
93
+ }
94
+ function euclideanDistance(a, b) {
95
+ return Math.sqrt((a.colorTemp - b.colorTemp) ** 2 +
96
+ (a.lightness - b.lightness) ** 2 +
97
+ (a.density - b.density) ** 2 +
98
+ (a.borderRadius - b.borderRadius) ** 2 +
99
+ (a.tone - b.tone) ** 2);
100
+ }
101
+ export function matchArchetype(answers) {
102
+ const targetVector = deriveVector(answers);
103
+ const archetypes = loadArchetypes();
104
+ const primaryCategory = answers.productType[0];
105
+ const CATEGORY_BONUS = 0.2;
106
+ return archetypes
107
+ .map((archetype) => {
108
+ let distance = euclideanDistance(targetVector, archetype.dimensions);
109
+ if (archetype.category === primaryCategory) {
110
+ distance *= 1 - CATEGORY_BONUS;
111
+ }
112
+ return { archetype, distance };
113
+ })
114
+ .sort((a, b) => a.distance - b.distance);
115
+ }
116
+ //# sourceMappingURL=matcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matcher.js","sourceRoot":"","sources":["../../src/design-md/matcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { QuestionnaireAnswers } from './types.js';
2
+ export interface QuestionChoice {
3
+ value: string;
4
+ name: string;
5
+ }
6
+ export interface QuestionDefinition {
7
+ id: keyof QuestionnaireAnswers | 'productType' | 'audience' | 'mood' | 'density' | 'reference';
8
+ type: 'checkbox' | 'select' | 'input';
9
+ message: string;
10
+ choices: QuestionChoice[];
11
+ required: boolean;
12
+ }
13
+ export declare const QUESTIONS: QuestionDefinition[];
14
+ export declare function runQuestionnaire(): Promise<QuestionnaireAnswers>;
15
+ //# sourceMappingURL=questionnaire.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"questionnaire.d.ts","sourceRoot":"","sources":["../../src/design-md/questionnaire.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,oBAAoB,GAAG,aAAa,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;IAC/F,IAAI,EAAE,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,SAAS,EAAE,kBAAkB,EAiEzC,CAAC;AAEF,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAkCtE"}
@@ -0,0 +1,96 @@
1
+ export const QUESTIONS = [
2
+ {
3
+ id: 'productType',
4
+ type: 'checkbox',
5
+ message: 'What type of product are you building? (first = primary, rest = secondary)',
6
+ required: true,
7
+ choices: [
8
+ { value: 'internal-tool', name: 'Internal Tool' },
9
+ { value: 'dashboard', name: 'Dashboard / Analytics' },
10
+ { value: 'consumer', name: 'Consumer App' },
11
+ { value: 'developer', name: 'Developer Tool / API' },
12
+ { value: 'mobile', name: 'Mobile App' },
13
+ { value: 'e-commerce', name: 'E-Commerce' },
14
+ { value: 'marketing', name: 'Marketing / Landing' },
15
+ { value: 'form-heavy', name: 'Form-Heavy / Workflow' },
16
+ { value: 'content', name: 'Content / Documentation' },
17
+ ],
18
+ },
19
+ {
20
+ id: 'audience',
21
+ type: 'select',
22
+ message: 'Who is the primary audience?',
23
+ required: true,
24
+ choices: [
25
+ { value: 'developers', name: 'Developers / Engineers' },
26
+ { value: 'business', name: 'Business Users / Analysts' },
27
+ { value: 'general', name: 'General Public' },
28
+ { value: 'designers', name: 'Designers / Creatives' },
29
+ { value: 'enterprise', name: 'Enterprise / Compliance-sensitive' },
30
+ ],
31
+ },
32
+ {
33
+ id: 'mood',
34
+ type: 'checkbox',
35
+ message: 'Select mood keywords that describe the feel you want:',
36
+ required: true,
37
+ choices: [
38
+ { value: 'clean', name: 'Clean / Minimal' },
39
+ { value: 'playful', name: 'Playful / Fun' },
40
+ { value: 'serious', name: 'Serious / Professional' },
41
+ { value: 'warm', name: 'Warm / Friendly' },
42
+ { value: 'bold', name: 'Bold / Energetic' },
43
+ { value: 'calm', name: 'Calm / Neutral' },
44
+ { value: 'dark', name: 'Dark / Techy' },
45
+ { value: 'luxurious', name: 'Luxurious / Premium' },
46
+ ],
47
+ },
48
+ {
49
+ id: 'density',
50
+ type: 'select',
51
+ message: 'How dense should the interface be?',
52
+ required: true,
53
+ choices: [
54
+ { value: 'compact', name: 'Compact — dense tables, small spacing' },
55
+ { value: 'balanced', name: 'Balanced — moderate spacing' },
56
+ { value: 'spacious', name: 'Spacious — generous whitespace' },
57
+ ],
58
+ },
59
+ {
60
+ id: 'reference',
61
+ type: 'input',
62
+ message: 'Any reference product or site for style inspiration? (optional, press Enter to skip)',
63
+ required: false,
64
+ choices: [],
65
+ },
66
+ ];
67
+ export async function runQuestionnaire() {
68
+ const { checkbox, select, input } = await import('@inquirer/prompts');
69
+ const productType = await checkbox({
70
+ message: QUESTIONS[0].message,
71
+ choices: QUESTIONS[0].choices,
72
+ });
73
+ const audience = await select({
74
+ message: QUESTIONS[1].message,
75
+ choices: QUESTIONS[1].choices,
76
+ });
77
+ const mood = await select({
78
+ message: QUESTIONS[2].message,
79
+ choices: QUESTIONS[2].choices,
80
+ });
81
+ const density = await select({
82
+ message: QUESTIONS[3].message,
83
+ choices: QUESTIONS[3].choices,
84
+ });
85
+ const reference = await input({
86
+ message: QUESTIONS[4].message,
87
+ });
88
+ return {
89
+ productType,
90
+ audience,
91
+ mood,
92
+ density,
93
+ reference: reference || null,
94
+ };
95
+ }
96
+ //# sourceMappingURL=questionnaire.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"questionnaire.js","sourceRoot":"","sources":["../../src/design-md/questionnaire.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Archetype, DimensionVector } from './types.js';
2
+ export declare function renderDesignMd(archetype: Archetype, vector: DimensionVector): string;
3
+ //# sourceMappingURL=renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/design-md/renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7D,wBAAgB,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,MAAM,CA4CpF"}
@@ -0,0 +1,43 @@
1
+ import { stringify as yamlStringify, parse as parseYaml } from 'yaml';
2
+ export function renderDesignMd(archetype, vector) {
3
+ const templateTokens = parseYaml(archetype.template);
4
+ const frontMatter = {
5
+ archetype: archetype.id,
6
+ dimensions: vector,
7
+ tokens: templateTokens.tokens,
8
+ };
9
+ const yamlContent = yamlStringify(frontMatter).trim();
10
+ const markdown = `
11
+ # Style Direction
12
+
13
+ Based on **${archetype.name}** archetype (reference: ${archetype.anchors.primary}).
14
+
15
+ Dimension profile: colorTemp=${vector.colorTemp}, lightness=${vector.lightness}, density=${vector.density}, borderRadius=${vector.borderRadius}, tone=${vector.tone}.
16
+
17
+ ## Color Palette
18
+
19
+ Primary: \`${templateTokens.tokens.colors.primary}\`
20
+ Background: \`${templateTokens.tokens.colors.background}\`
21
+ Surface: \`${templateTokens.tokens.colors.surface}\`
22
+ Text: \`${templateTokens.tokens.colors.text}\`
23
+ Accent: \`${templateTokens.tokens.colors.accent}\`
24
+
25
+ ## Typography
26
+
27
+ Font family: ${templateTokens.tokens.typography.fontFamily}
28
+ Scale: ${templateTokens.tokens.typography.scale.join(', ')}
29
+
30
+ ## Spacing
31
+
32
+ Base unit: ${templateTokens.tokens.spacing.base}
33
+ Scale: ${templateTokens.tokens.spacing.scale.join(', ')}
34
+
35
+ ## Components
36
+
37
+ Border radius: ${templateTokens.tokens.radius.default} (default), ${templateTokens.tokens.radius.large} (large)
38
+ Density: ${templateTokens.tokens.density.compact ? 'compact' : 'comfortable'}
39
+ Table row height: ${templateTokens.tokens.density.tableRowHeight}
40
+ `;
41
+ return `---\n${yamlContent}\n---\n${markdown}`;
42
+ }
43
+ //# sourceMappingURL=renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/design-md/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAGtE,MAAM,UAAU,cAAc,CAAC,SAAoB,EAAE,MAAuB;IAC1E,MAAM,cAAc,GAAG,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAErD,MAAM,WAAW,GAAG;QAClB,SAAS,EAAE,SAAS,CAAC,EAAE;QACvB,UAAU,EAAE,MAAM;QAClB,MAAM,EAAE,cAAc,CAAC,MAAM;KAC9B,CAAC;IAEF,MAAM,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC;IAEtD,MAAM,QAAQ,GAAG;;;aAGN,SAAS,CAAC,IAAI,4BAA4B,SAAS,CAAC,OAAO,CAAC,OAAO;;+BAEjD,MAAM,CAAC,SAAS,eAAe,MAAM,CAAC,SAAS,aAAa,MAAM,CAAC,OAAO,kBAAkB,MAAM,CAAC,YAAY,UAAU,MAAM,CAAC,IAAI;;;;aAItJ,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO;gBACjC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU;aAC1C,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO;UACvC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI;YAC/B,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM;;;;eAIhC,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU;SACjD,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;;;;aAI7C,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI;SACtC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;;;;iBAItC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,eAAe,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK;WAC3F,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa;oBACxD,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc;CAC/D,CAAC;IAEA,OAAO,QAAQ,WAAW,UAAU,QAAQ,EAAE,CAAC;AACjD,CAAC"}
@@ -0,0 +1,69 @@
1
+ import { z } from 'zod';
2
+ export declare const ArchetypeSchema: z.ZodObject<{
3
+ id: z.ZodString;
4
+ name: z.ZodString;
5
+ category: z.ZodEnum<["internal-tool", "dashboard", "consumer", "developer", "mobile", "e-commerce", "marketing", "form-heavy", "content"]>;
6
+ dimensions: z.ZodObject<{
7
+ colorTemp: z.ZodNumber;
8
+ lightness: z.ZodNumber;
9
+ density: z.ZodNumber;
10
+ borderRadius: z.ZodNumber;
11
+ tone: z.ZodNumber;
12
+ }, "strip", z.ZodTypeAny, {
13
+ colorTemp: number;
14
+ lightness: number;
15
+ density: number;
16
+ borderRadius: number;
17
+ tone: number;
18
+ }, {
19
+ colorTemp: number;
20
+ lightness: number;
21
+ density: number;
22
+ borderRadius: number;
23
+ tone: number;
24
+ }>;
25
+ anchors: z.ZodObject<{
26
+ primary: z.ZodString;
27
+ auxiliary: z.ZodArray<z.ZodString, "many">;
28
+ }, "strip", z.ZodTypeAny, {
29
+ primary: string;
30
+ auxiliary: string[];
31
+ }, {
32
+ primary: string;
33
+ auxiliary: string[];
34
+ }>;
35
+ template: z.ZodString;
36
+ }, "strip", z.ZodTypeAny, {
37
+ id: string;
38
+ name: string;
39
+ category: "internal-tool" | "dashboard" | "consumer" | "developer" | "mobile" | "e-commerce" | "marketing" | "form-heavy" | "content";
40
+ dimensions: {
41
+ colorTemp: number;
42
+ lightness: number;
43
+ density: number;
44
+ borderRadius: number;
45
+ tone: number;
46
+ };
47
+ anchors: {
48
+ primary: string;
49
+ auxiliary: string[];
50
+ };
51
+ template: string;
52
+ }, {
53
+ id: string;
54
+ name: string;
55
+ category: "internal-tool" | "dashboard" | "consumer" | "developer" | "mobile" | "e-commerce" | "marketing" | "form-heavy" | "content";
56
+ dimensions: {
57
+ colorTemp: number;
58
+ lightness: number;
59
+ density: number;
60
+ borderRadius: number;
61
+ tone: number;
62
+ };
63
+ anchors: {
64
+ primary: string;
65
+ auxiliary: string[];
66
+ };
67
+ template: string;
68
+ }>;
69
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/design-md/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0B1B,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { z } from 'zod';
2
+ const DimensionValueSchema = z.number().int().min(1).max(5);
3
+ export const ArchetypeSchema = z.object({
4
+ id: z.string().regex(/^[a-z][a-z0-9-]*$/),
5
+ name: z.string().min(1),
6
+ category: z.enum([
7
+ 'internal-tool',
8
+ 'dashboard',
9
+ 'consumer',
10
+ 'developer',
11
+ 'mobile',
12
+ 'e-commerce',
13
+ 'marketing',
14
+ 'form-heavy',
15
+ 'content',
16
+ ]),
17
+ dimensions: z.object({
18
+ colorTemp: DimensionValueSchema,
19
+ lightness: DimensionValueSchema,
20
+ density: DimensionValueSchema,
21
+ borderRadius: DimensionValueSchema,
22
+ tone: DimensionValueSchema,
23
+ }),
24
+ anchors: z.object({
25
+ primary: z.string().min(1),
26
+ auxiliary: z.array(z.string().min(1)).min(1).max(2),
27
+ }),
28
+ template: z.string().min(1),
29
+ });
30
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/design-md/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAE5D,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC;IACzC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC;QACf,eAAe;QACf,WAAW;QACX,UAAU;QACV,WAAW;QACX,QAAQ;QACR,YAAY;QACZ,WAAW;QACX,YAAY;QACZ,SAAS;KACV,CAAC;IACF,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;QACnB,SAAS,EAAE,oBAAoB;QAC/B,SAAS,EAAE,oBAAoB;QAC/B,OAAO,EAAE,oBAAoB;QAC7B,YAAY,EAAE,oBAAoB;QAClC,IAAI,EAAE,oBAAoB;KAC3B,CAAC;IACF,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;KACpD,CAAC;IACF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC5B,CAAC,CAAC"}
@@ -0,0 +1,33 @@
1
+ export type DimensionValue = 1 | 2 | 3 | 4 | 5;
2
+ export interface DimensionVector {
3
+ colorTemp: DimensionValue;
4
+ lightness: DimensionValue;
5
+ density: DimensionValue;
6
+ borderRadius: DimensionValue;
7
+ tone: DimensionValue;
8
+ }
9
+ export type ArchetypeCategory = 'internal-tool' | 'dashboard' | 'consumer' | 'developer' | 'mobile' | 'e-commerce' | 'marketing' | 'form-heavy' | 'content';
10
+ export interface Archetype {
11
+ id: string;
12
+ name: string;
13
+ category: ArchetypeCategory;
14
+ dimensions: DimensionVector;
15
+ anchors: {
16
+ primary: string;
17
+ auxiliary: string[];
18
+ };
19
+ template: string;
20
+ }
21
+ export interface QuestionnaireAnswers {
22
+ productType: string[];
23
+ audience: string;
24
+ mood: string;
25
+ density: string;
26
+ reference: string | null;
27
+ }
28
+ export interface DesignMdConfig {
29
+ archetype: Archetype;
30
+ finalVector: DimensionVector;
31
+ answers: QuestionnaireAnswers;
32
+ }
33
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/design-md/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAE/C,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,cAAc,CAAC;IAC1B,SAAS,EAAE,cAAc,CAAC;IAC1B,OAAO,EAAE,cAAc,CAAC;IACxB,YAAY,EAAE,cAAc,CAAC;IAC7B,IAAI,EAAE,cAAc,CAAC;CACtB;AAED,MAAM,MAAM,iBAAiB,GACzB,eAAe,GACf,WAAW,GACX,UAAU,GACV,WAAW,GACX,QAAQ,GACR,YAAY,GACZ,WAAW,GACX,YAAY,GACZ,SAAS,CAAC;AAEd,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,UAAU,EAAE,eAAe,CAAC;IAC5B,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAClD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,eAAe,CAAC;IAC7B,OAAO,EAAE,oBAAoB,CAAC;CAC/B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/design-md/types.ts"],"names":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"scaffolder.d.ts","sourceRoot":"","sources":["../src/scaffolder.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA0EhD,wBAAsB,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA4KnE"}
1
+ {"version":3,"file":"scaffolder.d.ts","sourceRoot":"","sources":["../src/scaffolder.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA2EhD,wBAAsB,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAsLnE"}
@@ -7,6 +7,7 @@ import { composeGitignore } from './templates/gitignore.js';
7
7
  import { composeClaudeSettings } from './templates/claude-settings.js';
8
8
  import { composeOpenspecConfig } from './templates/openspec-config.js';
9
9
  import { composeGrillMeSkill } from './templates/grill-me-skill.js';
10
+ import { composeDesignMdSkill } from './templates/design-md-skill.js';
10
11
  import { composeCLAUDEmd } from './templates/claude-md.js';
11
12
  import { createDir, writeText, writeJSON, writeYAML } from './utils/fs.js';
12
13
  import { gitInit, gitInitialCommit } from './utils/git.js';
@@ -125,6 +126,15 @@ export async function scaffold(config) {
125
126
  await createDir(path.join(targetDir, '.claude', 'skills', 'grill-me'));
126
127
  await writeText(grillSkillPath, composeGrillMeSkill());
127
128
  }
129
+ // Design-md skill
130
+ spinner.text = 'Writing .claude/skills/design-md/SKILL.md...';
131
+ const designMdSkillPath = path.join(targetDir, '.claude', 'skills', 'design-md', 'SKILL.md');
132
+ const existingDesignMdSkill = await readTextSafe(designMdSkillPath);
133
+ if (!existingDesignMdSkill) {
134
+ await createDir(path.join(targetDir, '.claude', 'skills', 'design-md'));
135
+ await writeText(designMdSkillPath, composeDesignMdSkill());
136
+ }
137
+ spinner.succeed('Installed design-md skill');
128
138
  // OpenSpec
129
139
  if (config.initOpenspec) {
130
140
  spinner.text = 'Setting up OpenSpec...';