@aibloom/core 0.2.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.
- package/README.md +16 -0
- package/dist/design-docs/ConflictDetector.d.ts +21 -0
- package/dist/design-docs/ConflictDetector.d.ts.map +1 -0
- package/dist/design-docs/ConflictDetector.js +221 -0
- package/dist/design-docs/ConflictDetector.js.map +1 -0
- package/dist/design-docs/DesignDocParser.d.ts +17 -0
- package/dist/design-docs/DesignDocParser.d.ts.map +1 -0
- package/dist/design-docs/DesignDocParser.js +112 -0
- package/dist/design-docs/DesignDocParser.js.map +1 -0
- package/dist/design-docs/DesignSystemSynthesizer.d.ts +9 -0
- package/dist/design-docs/DesignSystemSynthesizer.d.ts.map +1 -0
- package/dist/design-docs/DesignSystemSynthesizer.js +141 -0
- package/dist/design-docs/DesignSystemSynthesizer.js.map +1 -0
- package/dist/design-docs/FusionOptionGenerator.d.ts +11 -0
- package/dist/design-docs/FusionOptionGenerator.d.ts.map +1 -0
- package/dist/design-docs/FusionOptionGenerator.js +157 -0
- package/dist/design-docs/FusionOptionGenerator.js.map +1 -0
- package/dist/design-docs/StyleFingerprintExtractor.d.ts +32 -0
- package/dist/design-docs/StyleFingerprintExtractor.d.ts.map +1 -0
- package/dist/design-docs/StyleFingerprintExtractor.js +365 -0
- package/dist/design-docs/StyleFingerprintExtractor.js.map +1 -0
- package/dist/design-docs/TokenNormalizer.d.ts +13 -0
- package/dist/design-docs/TokenNormalizer.d.ts.map +1 -0
- package/dist/design-docs/TokenNormalizer.js +97 -0
- package/dist/design-docs/TokenNormalizer.js.map +1 -0
- package/dist/errors.d.ts +7 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +11 -0
- package/dist/errors.js.map +1 -0
- package/dist/framework/FrameworkAdapter.d.ts +10 -0
- package/dist/framework/FrameworkAdapter.d.ts.map +1 -0
- package/dist/framework/FrameworkAdapter.js +2 -0
- package/dist/framework/FrameworkAdapter.js.map +1 -0
- package/dist/framework/package.d.ts +8 -0
- package/dist/framework/package.d.ts.map +1 -0
- package/dist/framework/package.js +32 -0
- package/dist/framework/package.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/json.d.ts +5 -0
- package/dist/json.d.ts.map +1 -0
- package/dist/json.js +43 -0
- package/dist/json.js.map +1 -0
- package/dist/safety/FileChangeApplier.d.ts +8 -0
- package/dist/safety/FileChangeApplier.d.ts.map +1 -0
- package/dist/safety/FileChangeApplier.js +73 -0
- package/dist/safety/FileChangeApplier.js.map +1 -0
- package/dist/state/ProjectStateStore.d.ts +16 -0
- package/dist/state/ProjectStateStore.d.ts.map +1 -0
- package/dist/state/ProjectStateStore.js +164 -0
- package/dist/state/ProjectStateStore.js.map +1 -0
- package/dist/state/RunRecordStore.d.ts +10 -0
- package/dist/state/RunRecordStore.d.ts.map +1 -0
- package/dist/state/RunRecordStore.js +39 -0
- package/dist/state/RunRecordStore.js.map +1 -0
- package/dist/tasks/TaskStore.d.ts +12 -0
- package/dist/tasks/TaskStore.d.ts.map +1 -0
- package/dist/tasks/TaskStore.js +48 -0
- package/dist/tasks/TaskStore.js.map +1 -0
- package/package.json +24 -0
package/README.md
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# @aibloom/core
|
|
2
|
+
|
|
3
|
+
Workflow engine, orchestrator, state machine, and design pipeline core for Aibloom.
|
|
4
|
+
|
|
5
|
+
## Modules
|
|
6
|
+
|
|
7
|
+
- **State** — State machine with validated transitions, project state store, run record store
|
|
8
|
+
- **Design Docs** — DESIGN.md parser, style fingerprint extractor, token normalizer, conflict detector, fusion option generator, design system synthesizer
|
|
9
|
+
- **Page Planner** — Structured page shape and implementation plan generation
|
|
10
|
+
- **Verification** — Document existence checks and compliance reporting
|
|
11
|
+
|
|
12
|
+
## Usage
|
|
13
|
+
|
|
14
|
+
```ts
|
|
15
|
+
import { VibeUIOrchestrator } from "@aibloom/core";
|
|
16
|
+
```
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type StyleFingerprint, type StyleConflictReport } from "@aibloom/schemas";
|
|
2
|
+
/**
|
|
3
|
+
* Detects design conflicts between multiple StyleFingerprints.
|
|
4
|
+
* Checks 10 dimensions: theme, canvas, accent, typography, radius,
|
|
5
|
+
* elevation, layout, imagery, motion, anti-patterns.
|
|
6
|
+
*/
|
|
7
|
+
export declare class ConflictDetector {
|
|
8
|
+
detect(fingerprints: StyleFingerprint[]): StyleConflictReport;
|
|
9
|
+
private conflict;
|
|
10
|
+
private defaultRecommendation;
|
|
11
|
+
private pairs;
|
|
12
|
+
private haveDifferentValues;
|
|
13
|
+
private detectDisplayConflict;
|
|
14
|
+
private elevationSeverity;
|
|
15
|
+
private detectAntiPatternContradictions;
|
|
16
|
+
private computeCompatibilityScore;
|
|
17
|
+
private buildSummary;
|
|
18
|
+
private findSafeFusions;
|
|
19
|
+
private recommendOptions;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=ConflictDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConflictDetector.d.ts","sourceRoot":"","sources":["../../src/design-docs/ConflictDetector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,gBAAgB,EAAuB,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAExH;;;;GAIG;AACH,qBAAa,gBAAgB;IAC3B,MAAM,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,mBAAmB;IAqG7D,OAAO,CAAC,QAAQ;IAkBhB,OAAO,CAAC,qBAAqB;IAiB7B,OAAO,CAAC,KAAK;IAUb,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,qBAAqB;IAiB7B,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,+BAA+B;IAqBvC,OAAO,CAAC,yBAAyB;IASjC,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,gBAAgB;CAgBzB"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { SCHEMA_VERSION } from "@aibloom/schemas";
|
|
2
|
+
/**
|
|
3
|
+
* Detects design conflicts between multiple StyleFingerprints.
|
|
4
|
+
* Checks 10 dimensions: theme, canvas, accent, typography, radius,
|
|
5
|
+
* elevation, layout, imagery, motion, anti-patterns.
|
|
6
|
+
*/
|
|
7
|
+
export class ConflictDetector {
|
|
8
|
+
detect(fingerprints) {
|
|
9
|
+
if (fingerprints.length < 2) {
|
|
10
|
+
return {
|
|
11
|
+
schemaVersion: SCHEMA_VERSION,
|
|
12
|
+
compatibilityScore: 100,
|
|
13
|
+
fusionRisk: "low",
|
|
14
|
+
summary: "Single reference — no conflicts to detect.",
|
|
15
|
+
conflicts: [],
|
|
16
|
+
safeFusions: [],
|
|
17
|
+
nonNegotiableConflicts: [],
|
|
18
|
+
recommendedOptions: [],
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
const conflicts = [];
|
|
22
|
+
const pairs = this.pairs(fingerprints);
|
|
23
|
+
for (const [a, b] of pairs) {
|
|
24
|
+
const refs = [a.id, b.id];
|
|
25
|
+
// 1. Theme
|
|
26
|
+
if (a.theme && b.theme && a.theme !== b.theme) {
|
|
27
|
+
conflicts.push(this.conflict("theme", refs, "weak-conflict", a.theme, b.theme, 1));
|
|
28
|
+
}
|
|
29
|
+
// 2. Canvas
|
|
30
|
+
if (this.haveDifferentValues(a.colorSystem.canvas, b.colorSystem.canvas)) {
|
|
31
|
+
conflicts.push(this.conflict("canvas", refs, "strong-conflict", "canvas color", "canvas color", 2));
|
|
32
|
+
}
|
|
33
|
+
// 3. Accent
|
|
34
|
+
if (this.haveDifferentValues(a.colorSystem.accent, b.colorSystem.accent)) {
|
|
35
|
+
conflicts.push(this.conflict("accent", refs, "strong-conflict", a.colorSystem.accent[0] ?? "?", b.colorSystem.accent[0] ?? "?", 3));
|
|
36
|
+
}
|
|
37
|
+
// 4. Typography
|
|
38
|
+
if (a.typography.display && b.typography.display) {
|
|
39
|
+
const displayConflict = this.detectDisplayConflict(a, b);
|
|
40
|
+
if (displayConflict)
|
|
41
|
+
conflicts.push(displayConflict);
|
|
42
|
+
}
|
|
43
|
+
// 5. Radius
|
|
44
|
+
if (a.shapeLanguage.cardRadius && b.shapeLanguage.cardRadius
|
|
45
|
+
&& a.shapeLanguage.cardRadius !== b.shapeLanguage.cardRadius) {
|
|
46
|
+
conflicts.push(this.conflict("radius", refs, "strong-conflict", a.shapeLanguage.cardRadius, b.shapeLanguage.cardRadius, 2));
|
|
47
|
+
}
|
|
48
|
+
// 6. Elevation
|
|
49
|
+
if (a.shapeLanguage.shadowStyle !== b.shapeLanguage.shadowStyle) {
|
|
50
|
+
const severity = this.elevationSeverity(a.shapeLanguage.shadowStyle, b.shapeLanguage.shadowStyle);
|
|
51
|
+
conflicts.push(this.conflict("elevation", refs, "strong-conflict", a.shapeLanguage.shadowStyle, b.shapeLanguage.shadowStyle, severity));
|
|
52
|
+
}
|
|
53
|
+
// 7. Layout
|
|
54
|
+
if (a.layoutLanguage.heroPattern && b.layoutLanguage.heroPattern
|
|
55
|
+
&& a.layoutLanguage.heroPattern !== b.layoutLanguage.heroPattern) {
|
|
56
|
+
conflicts.push(this.conflict("layout", refs, "weak-conflict", a.layoutLanguage.heroPattern, b.layoutLanguage.heroPattern, 1));
|
|
57
|
+
}
|
|
58
|
+
// 8. Imagery
|
|
59
|
+
if (this.haveDifferentValues(a.imagery.allowed, b.imagery.allowed)) {
|
|
60
|
+
conflicts.push(this.conflict("imagery", refs, "weak-conflict", "imagery rules", "imagery rules", 1));
|
|
61
|
+
}
|
|
62
|
+
// 9. Components
|
|
63
|
+
if (this.haveDifferentValues(a.componentLanguage, b.componentLanguage)) {
|
|
64
|
+
conflicts.push(this.conflict("components", refs, "weak-conflict", "component language", "component language", 1));
|
|
65
|
+
}
|
|
66
|
+
// 10. Motion
|
|
67
|
+
if (a.motion.inferredTone !== b.motion.inferredTone) {
|
|
68
|
+
conflicts.push(this.conflict("motion", refs, "compatible", a.motion.inferredTone, b.motion.inferredTone, 0));
|
|
69
|
+
}
|
|
70
|
+
// 11. Anti-patterns contradiction
|
|
71
|
+
const apConflicts = this.detectAntiPatternContradictions(a, b);
|
|
72
|
+
conflicts.push(...apConflicts);
|
|
73
|
+
}
|
|
74
|
+
const score = this.computeCompatibilityScore(conflicts);
|
|
75
|
+
const risk = score >= 70 ? "low" : score >= 40 ? "medium" : "high";
|
|
76
|
+
return {
|
|
77
|
+
schemaVersion: SCHEMA_VERSION,
|
|
78
|
+
compatibilityScore: score,
|
|
79
|
+
fusionRisk: risk,
|
|
80
|
+
summary: this.buildSummary(conflicts, score),
|
|
81
|
+
conflicts,
|
|
82
|
+
safeFusions: this.findSafeFusions(fingerprints),
|
|
83
|
+
nonNegotiableConflicts: conflicts
|
|
84
|
+
.filter((c) => c.severity >= 3)
|
|
85
|
+
.map((c) => ({ description: c.explanation, refA: c.references[0], refB: c.references[1] })),
|
|
86
|
+
recommendedOptions: this.recommendOptions(conflicts, fingerprints),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
conflict(dimension, references, relation, valA, valB, severity) {
|
|
90
|
+
return {
|
|
91
|
+
dimension,
|
|
92
|
+
references,
|
|
93
|
+
relation,
|
|
94
|
+
severity,
|
|
95
|
+
explanation: `${dimension}: "${valA}" vs "${valB}"`,
|
|
96
|
+
recommendation: this.defaultRecommendation(dimension),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
defaultRecommendation(dimension) {
|
|
100
|
+
const recs = {
|
|
101
|
+
theme: "Ensure both can be light, or choose one theme direction.",
|
|
102
|
+
canvas: "Choose one canvas color as primary, or split by page type.",
|
|
103
|
+
accent: "Select one primary accent color. The other can be used sparingly as decorative.",
|
|
104
|
+
typography: "Cannot mix two display type systems. Choose one as primary.",
|
|
105
|
+
radius: "Use one radius system consistently across the project.",
|
|
106
|
+
elevation: "Shadow and no-shadow cannot coexist globally. Split by page type.",
|
|
107
|
+
layout: "Hero patterns can differ by page type.",
|
|
108
|
+
imagery: "Imagery styles can differ by page context.",
|
|
109
|
+
components: "Component language can be unified, choosing the stronger convention where they differ.",
|
|
110
|
+
motion: "Motion tones can coexist when used contextually.",
|
|
111
|
+
"anti-patterns": "Resolve contradictory rules by choosing the stricter or more relevant constraint.",
|
|
112
|
+
};
|
|
113
|
+
return recs[dimension] ?? "Choose one approach or split by context.";
|
|
114
|
+
}
|
|
115
|
+
pairs(list) {
|
|
116
|
+
const result = [];
|
|
117
|
+
for (let i = 0; i < list.length; i++) {
|
|
118
|
+
for (let j = i + 1; j < list.length; j++) {
|
|
119
|
+
result.push([list[i], list[j]]);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return result;
|
|
123
|
+
}
|
|
124
|
+
haveDifferentValues(a, b) {
|
|
125
|
+
if (a.length === 0 && b.length === 0)
|
|
126
|
+
return false;
|
|
127
|
+
const setA = new Set(a.map((v) => v.toLowerCase()));
|
|
128
|
+
const setB = new Set(b.map((v) => v.toLowerCase()));
|
|
129
|
+
return !a.every((v) => setB.has(v.toLowerCase()))
|
|
130
|
+
|| !b.every((v) => setA.has(v.toLowerCase()));
|
|
131
|
+
}
|
|
132
|
+
detectDisplayConflict(a, b) {
|
|
133
|
+
const aFamily = a.typography.display.family.toLowerCase();
|
|
134
|
+
const bFamily = b.typography.display.family.toLowerCase();
|
|
135
|
+
const aTone = a.typography.display.tone.toLowerCase();
|
|
136
|
+
const bTone = b.typography.display.tone.toLowerCase();
|
|
137
|
+
if (aFamily === bFamily && aTone === bTone)
|
|
138
|
+
return null;
|
|
139
|
+
// Serif vs condensed/brutalist is a strong conflict
|
|
140
|
+
if ((/serif|editorial/i.test(aTone) && /condensed|brutalist|bold/i.test(bTone))
|
|
141
|
+
|| (/serif|editorial/i.test(bTone) && /condensed|brutalist|bold/i.test(aTone))) {
|
|
142
|
+
return this.conflict("typography", [a.id, b.id], "strong-conflict", aFamily, bFamily, 3);
|
|
143
|
+
}
|
|
144
|
+
return this.conflict("typography", [a.id, b.id], "weak-conflict", aFamily, bFamily, 1);
|
|
145
|
+
}
|
|
146
|
+
elevationSeverity(a, b) {
|
|
147
|
+
if ((a === "none" && b !== "none") || (b === "none" && a !== "none"))
|
|
148
|
+
return 3;
|
|
149
|
+
if (a === b)
|
|
150
|
+
return 0;
|
|
151
|
+
return 2;
|
|
152
|
+
}
|
|
153
|
+
detectAntiPatternContradictions(a, b) {
|
|
154
|
+
const conflicts = [];
|
|
155
|
+
for (const ap of a.antiPatterns) {
|
|
156
|
+
// Check if B's Do's recommend what A has as anti-pattern
|
|
157
|
+
const apLower = ap.toLowerCase();
|
|
158
|
+
for (const comp of b.componentLanguage) {
|
|
159
|
+
if (comp.toLowerCase().includes(apLower.replace(/don['']?t\s*/, ""))) {
|
|
160
|
+
conflicts.push({
|
|
161
|
+
dimension: "anti-patterns",
|
|
162
|
+
references: [a.id, b.id],
|
|
163
|
+
relation: "mutually-exclusive",
|
|
164
|
+
severity: 3,
|
|
165
|
+
explanation: `${a.name} forbids: "${ap}", but ${b.name} recommends similar patterns.`,
|
|
166
|
+
recommendation: "Choose which reference's constraint to follow.",
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return conflicts;
|
|
172
|
+
}
|
|
173
|
+
computeCompatibilityScore(conflicts) {
|
|
174
|
+
// Start at 100, deduct based on severity
|
|
175
|
+
let score = 100;
|
|
176
|
+
for (const c of conflicts) {
|
|
177
|
+
score -= c.severity * 10;
|
|
178
|
+
}
|
|
179
|
+
return Math.max(0, Math.min(100, score));
|
|
180
|
+
}
|
|
181
|
+
buildSummary(conflicts, score) {
|
|
182
|
+
const strongConflicts = conflicts.filter((c) => c.severity >= 3);
|
|
183
|
+
const dimensions = [...new Set(strongConflicts.map((c) => c.dimension))];
|
|
184
|
+
if (score >= 80)
|
|
185
|
+
return "High compatibility. Minor differences that can be merged automatically.";
|
|
186
|
+
if (score >= 50)
|
|
187
|
+
return `Moderate compatibility. Notable conflicts in: ${dimensions.join(", ")}. User choice recommended.`;
|
|
188
|
+
return `Low compatibility (score: ${score}). Strong conflicts in: ${dimensions.join(", ")}. User must choose fusion strategy.`;
|
|
189
|
+
}
|
|
190
|
+
findSafeFusions(fingerprints) {
|
|
191
|
+
const safe = [];
|
|
192
|
+
const shared = new Set();
|
|
193
|
+
for (const fp of fingerprints) {
|
|
194
|
+
for (const ap of fp.antiPatterns) {
|
|
195
|
+
if (shared.has(ap.toLowerCase())) {
|
|
196
|
+
safe.push(ap);
|
|
197
|
+
}
|
|
198
|
+
shared.add(ap.toLowerCase());
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (safe.length === 0)
|
|
202
|
+
safe.push("No shared anti-patterns detected — fusion may require manual guidance.");
|
|
203
|
+
return safe;
|
|
204
|
+
}
|
|
205
|
+
recommendOptions(conflicts, fingerprints) {
|
|
206
|
+
const options = [];
|
|
207
|
+
const score = this.computeCompatibilityScore(conflicts);
|
|
208
|
+
options.push("primary-plus-accent");
|
|
209
|
+
if (fingerprints.length === 2)
|
|
210
|
+
options.push("page-type-split");
|
|
211
|
+
if (score < 60) {
|
|
212
|
+
options.push("new-derived-system");
|
|
213
|
+
options.push("reject-and-restart");
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
options.push("layered-fusion");
|
|
217
|
+
}
|
|
218
|
+
return options;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=ConflictDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConflictDetector.js","sourceRoot":"","sources":["../../src/design-docs/ConflictDetector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type DesignReferenceDocument } from "@aibloom/schemas";
|
|
2
|
+
interface ParseInput {
|
|
3
|
+
path: string;
|
|
4
|
+
name?: string;
|
|
5
|
+
sourceType: "refero" | "figma-export" | "manual" | "unknown";
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Parses a Markdown DESIGN.md into a structured DesignReferenceDocument.
|
|
9
|
+
* Handles headings, paragraphs, tables, and fenced code blocks.
|
|
10
|
+
*/
|
|
11
|
+
export declare class DesignDocParser {
|
|
12
|
+
parse(input: ParseInput): Promise<DesignReferenceDocument>;
|
|
13
|
+
private extractTitle;
|
|
14
|
+
private extractSections;
|
|
15
|
+
}
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=DesignDocParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DesignDocParser.d.ts","sourceRoot":"","sources":["../../src/design-docs/DesignDocParser.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,KAAK,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAUhF,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,QAAQ,GAAG,cAAc,GAAG,QAAQ,GAAG,SAAS,CAAC;CAC9D;AAED;;;GAGG;AACH,qBAAa,eAAe;IACpB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAoBhE,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,eAAe;CAwFxB"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import { SCHEMA_VERSION } from "@aibloom/schemas";
|
|
3
|
+
/**
|
|
4
|
+
* Parses a Markdown DESIGN.md into a structured DesignReferenceDocument.
|
|
5
|
+
* Handles headings, paragraphs, tables, and fenced code blocks.
|
|
6
|
+
*/
|
|
7
|
+
export class DesignDocParser {
|
|
8
|
+
async parse(input) {
|
|
9
|
+
const rawText = await fs.readFile(input.path, "utf-8");
|
|
10
|
+
const sections = this.extractSections(rawText);
|
|
11
|
+
const id = input.name
|
|
12
|
+
? `ref-${input.name.toLowerCase().replace(/\s+/g, "-")}`
|
|
13
|
+
: `ref-${Date.now()}`;
|
|
14
|
+
return {
|
|
15
|
+
schemaVersion: SCHEMA_VERSION,
|
|
16
|
+
id,
|
|
17
|
+
name: input.name ?? this.extractTitle(rawText) ?? "unnamed",
|
|
18
|
+
sourceType: input.sourceType,
|
|
19
|
+
originalPath: input.path,
|
|
20
|
+
sections,
|
|
21
|
+
rawText,
|
|
22
|
+
importedAt: new Date().toISOString(),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
extractTitle(raw) {
|
|
26
|
+
const match = raw.match(/^#\s+(.+)$/m);
|
|
27
|
+
return match ? match[1].trim() : null;
|
|
28
|
+
}
|
|
29
|
+
extractSections(raw) {
|
|
30
|
+
const lines = raw.split("\n");
|
|
31
|
+
const sections = [];
|
|
32
|
+
let currentSection = null;
|
|
33
|
+
let inCodeBlock = false;
|
|
34
|
+
let codeBlockContent = "";
|
|
35
|
+
let tableBuffer = [];
|
|
36
|
+
function flushSection() {
|
|
37
|
+
if (currentSection) {
|
|
38
|
+
// Flush any pending table
|
|
39
|
+
if (tableBuffer.length > 0) {
|
|
40
|
+
currentSection.tables.push(tableBuffer.join("\n"));
|
|
41
|
+
tableBuffer = [];
|
|
42
|
+
}
|
|
43
|
+
sections.push(currentSection);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function flushTable() {
|
|
47
|
+
if (tableBuffer.length > 0 && currentSection) {
|
|
48
|
+
currentSection.tables.push(tableBuffer.join("\n"));
|
|
49
|
+
tableBuffer = [];
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
for (let i = 0; i < lines.length; i++) {
|
|
53
|
+
const line = lines[i];
|
|
54
|
+
// Handle code blocks
|
|
55
|
+
if (line.trimStart().startsWith("```")) {
|
|
56
|
+
if (!inCodeBlock) {
|
|
57
|
+
inCodeBlock = true;
|
|
58
|
+
codeBlockContent = "";
|
|
59
|
+
flushTable();
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
inCodeBlock = false;
|
|
64
|
+
if (currentSection) {
|
|
65
|
+
currentSection.codeBlocks.push(codeBlockContent);
|
|
66
|
+
}
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (inCodeBlock) {
|
|
71
|
+
codeBlockContent += line + "\n";
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
// Detect headings
|
|
75
|
+
const headingMatch = line.match(/^(#{1,6})\s+(.+)$/);
|
|
76
|
+
if (headingMatch) {
|
|
77
|
+
flushSection();
|
|
78
|
+
currentSection = {
|
|
79
|
+
heading: headingMatch[2].trim(),
|
|
80
|
+
level: headingMatch[1].length,
|
|
81
|
+
content: "",
|
|
82
|
+
tables: [],
|
|
83
|
+
codeBlocks: [],
|
|
84
|
+
};
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
// Detect table rows (line contains | and starts with |)
|
|
88
|
+
if (line.trimStart().startsWith("|")) {
|
|
89
|
+
// Check if it's a separator row (|---|...|)
|
|
90
|
+
if (/^\|[\s\-:]+\|/.test(line)) {
|
|
91
|
+
tableBuffer.push(line);
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
tableBuffer.push(line);
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
flushTable();
|
|
99
|
+
}
|
|
100
|
+
// Regular content
|
|
101
|
+
if (currentSection && line.trim()) {
|
|
102
|
+
currentSection.content += line + "\n";
|
|
103
|
+
}
|
|
104
|
+
else if (currentSection) {
|
|
105
|
+
currentSection.content += "\n";
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
flushSection();
|
|
109
|
+
return sections;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=DesignDocParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DesignDocParser.js","sourceRoot":"","sources":["../../src/design-docs/DesignDocParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,cAAc,EAAgC,MAAM,kBAAkB,CAAC;AAgBhF;;;GAGG;AACH,MAAM,OAAO,eAAe;IAC1B,KAAK,CAAC,KAAK,CAAC,KAAiB;QAC3B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAE/C,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI;YACnB,CAAC,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;YACxD,CAAC,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAExB,OAAO;YACL,aAAa,EAAE,cAAc;YAC7B,EAAE;YACF,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,SAAS;YAC3D,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,YAAY,EAAE,KAAK,CAAC,IAAI;YACxB,QAAQ;YACR,OAAO;YACP,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACrC,CAAC;IACJ,CAAC;IAEO,YAAY,CAAC,GAAW;QAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACvC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACxC,CAAC;IAEO,eAAe,CAAC,GAAW;QACjC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,QAAQ,GAAmB,EAAE,CAAC;QACpC,IAAI,cAAc,GAAwB,IAAI,CAAC;QAC/C,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,gBAAgB,GAAG,EAAE,CAAC;QAC1B,IAAI,WAAW,GAAa,EAAE,CAAC;QAE/B,SAAS,YAAY;YACnB,IAAI,cAAc,EAAE,CAAC;gBACnB,0BAA0B;gBAC1B,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC3B,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;oBACnD,WAAW,GAAG,EAAE,CAAC;gBACnB,CAAC;gBACD,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,SAAS,UAAU;YACjB,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,EAAE,CAAC;gBAC7C,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBACnD,WAAW,GAAG,EAAE,CAAC;YACnB,CAAC;QACH,CAAC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAEtB,qBAAqB;YACrB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvC,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,WAAW,GAAG,IAAI,CAAC;oBACnB,gBAAgB,GAAG,EAAE,CAAC;oBACtB,UAAU,EAAE,CAAC;oBACb,SAAS;gBACX,CAAC;qBAAM,CAAC;oBACN,WAAW,GAAG,KAAK,CAAC;oBACpB,IAAI,cAAc,EAAE,CAAC;wBACnB,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;oBACnD,CAAC;oBACD,SAAS;gBACX,CAAC;YACH,CAAC;YAED,IAAI,WAAW,EAAE,CAAC;gBAChB,gBAAgB,IAAI,IAAI,GAAG,IAAI,CAAC;gBAChC,SAAS;YACX,CAAC;YAED,kBAAkB;YAClB,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACrD,IAAI,YAAY,EAAE,CAAC;gBACjB,YAAY,EAAE,CAAC;gBACf,cAAc,GAAG;oBACf,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;oBAC/B,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM;oBAC7B,OAAO,EAAE,EAAE;oBACX,MAAM,EAAE,EAAE;oBACV,UAAU,EAAE,EAAE;iBACf,CAAC;gBACF,SAAS;YACX,CAAC;YAED,wDAAwD;YACxD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrC,4CAA4C;gBAC5C,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC/B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACvB,SAAS;gBACX,CAAC;gBACD,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACvB,SAAS;YACX,CAAC;iBAAM,CAAC;gBACN,UAAU,EAAE,CAAC;YACf,CAAC;YAED,kBAAkB;YAClB,IAAI,cAAc,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBAClC,cAAc,CAAC,OAAO,IAAI,IAAI,GAAG,IAAI,CAAC;YACxC,CAAC;iBAAM,IAAI,cAAc,EAAE,CAAC;gBAC1B,cAAc,CAAC,OAAO,IAAI,IAAI,CAAC;YACjC,CAAC;QACH,CAAC;QAED,YAAY,EAAE,CAAC;QACf,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type StyleFingerprint, type FusionDecision, type SynthesizedDesignSystem } from "@aibloom/schemas";
|
|
2
|
+
/**
|
|
3
|
+
* Synthesizes a project-level DESIGN.md from resolved fingerprints and a fusion decision.
|
|
4
|
+
* Produces: DESIGN.md content, DESIGN_FUSION_BRIEF.md content, and a source map.
|
|
5
|
+
*/
|
|
6
|
+
export declare class DesignSystemSynthesizer {
|
|
7
|
+
synthesize(fingerprints: StyleFingerprint[], fusionDecision: FusionDecision): SynthesizedDesignSystem;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=DesignSystemSynthesizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DesignSystemSynthesizer.d.ts","sourceRoot":"","sources":["../../src/design-docs/DesignSystemSynthesizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,KAAK,uBAAuB,EAA6B,MAAM,kBAAkB,CAAC;AAEvJ;;;GAGG;AACH,qBAAa,uBAAuB;IAClC,UAAU,CACR,YAAY,EAAE,gBAAgB,EAAE,EAChC,cAAc,EAAE,cAAc,GAC7B,uBAAuB;CAuJ3B"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { SCHEMA_VERSION } from "@aibloom/schemas";
|
|
2
|
+
/**
|
|
3
|
+
* Synthesizes a project-level DESIGN.md from resolved fingerprints and a fusion decision.
|
|
4
|
+
* Produces: DESIGN.md content, DESIGN_FUSION_BRIEF.md content, and a source map.
|
|
5
|
+
*/
|
|
6
|
+
export class DesignSystemSynthesizer {
|
|
7
|
+
synthesize(fingerprints, fusionDecision) {
|
|
8
|
+
const primary = fingerprints.find((f) => fusionDecision.finalReferenceRoles[f.id] === "primary");
|
|
9
|
+
const secondary = fingerprints.filter((f) => fusionDecision.finalReferenceRoles[f.id] === "secondary");
|
|
10
|
+
const decisions = [];
|
|
11
|
+
let decisionCounter = 0;
|
|
12
|
+
function record(dimension, finalRule, sourceIds, treatment) {
|
|
13
|
+
decisions.push({
|
|
14
|
+
decisionId: `DS-${String(++decisionCounter).padStart(3, "0")}`,
|
|
15
|
+
dimension,
|
|
16
|
+
finalRule,
|
|
17
|
+
sourceReferenceIds: sourceIds,
|
|
18
|
+
treatment,
|
|
19
|
+
rationale: `Fusion strategy: ${fusionDecision.selectedStrategy}`,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
// Build the project DESIGN.md content
|
|
23
|
+
let content = "# Project Design System\n\n";
|
|
24
|
+
content += `Generated from: ${fingerprints.map((f) => f.name).join(", ")}\n`;
|
|
25
|
+
content += `Fusion strategy: ${fusionDecision.selectedStrategy}\n`;
|
|
26
|
+
content += `User instruction: ${fusionDecision.userInstruction}\n\n`;
|
|
27
|
+
// Personality
|
|
28
|
+
content += "## 1. Personality\n\n";
|
|
29
|
+
const personality = primary?.personality ?? fingerprints.flatMap((f) => f.personality);
|
|
30
|
+
content += `- ${personality.join(", ")}\n\n`;
|
|
31
|
+
record("personality", personality.join(", "), primary ? [primary.id] : fingerprints.map((f) => f.id), "adopted");
|
|
32
|
+
// Visual Metaphor
|
|
33
|
+
if (primary?.visualMetaphor) {
|
|
34
|
+
content += "## 2. Visual Metaphor\n\n";
|
|
35
|
+
content += `${primary.visualMetaphor}\n\n`;
|
|
36
|
+
record("visual-metaphor", primary.visualMetaphor, [primary.id], "adopted");
|
|
37
|
+
}
|
|
38
|
+
// Color System
|
|
39
|
+
content += "## 3. Color System\n\n";
|
|
40
|
+
if (primary) {
|
|
41
|
+
content += "| Role | Hex | Usage |\n|------|-----|-------|\n";
|
|
42
|
+
for (const hex of primary.colorSystem.canvas) {
|
|
43
|
+
content += `| Canvas | ${hex} | Page background |\n`;
|
|
44
|
+
record("canvas", hex, [primary.id], "adopted");
|
|
45
|
+
}
|
|
46
|
+
for (const hex of primary.colorSystem.accent) {
|
|
47
|
+
content += `| Accent | ${hex} | Primary CTA |\n`;
|
|
48
|
+
record("accent", hex, [primary.id], "adopted");
|
|
49
|
+
}
|
|
50
|
+
for (const hex of primary.colorSystem.text) {
|
|
51
|
+
content += `| Text | ${hex} | Body text |\n`;
|
|
52
|
+
}
|
|
53
|
+
if (secondary.length > 0) {
|
|
54
|
+
for (const s of secondary) {
|
|
55
|
+
for (const hex of s.colorSystem.accent) {
|
|
56
|
+
content += `| Accent Alt | ${hex} | Secondary accent (from ${s.name}) |\n`;
|
|
57
|
+
record("accent-alt", hex, [s.id], "adapted");
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
// Derived: pull from all
|
|
64
|
+
for (const fp of fingerprints) {
|
|
65
|
+
content += `### From ${fp.name}\n\n`;
|
|
66
|
+
content += `| Role | Hex | Usage |\n|------|-----|-------|\n`;
|
|
67
|
+
for (const hex of fp.colorSystem.accent) {
|
|
68
|
+
content += `| Accent | ${hex} | CTA |\n`;
|
|
69
|
+
}
|
|
70
|
+
for (const hex of fp.colorSystem.canvas) {
|
|
71
|
+
content += `| Canvas | ${hex} | Background |\n`;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
content += "\n";
|
|
76
|
+
// Typography
|
|
77
|
+
content += "## 4. Typography\n\n";
|
|
78
|
+
if (primary?.typography.display) {
|
|
79
|
+
content += `### Display\n- Family: ${primary.typography.display.family}\n`;
|
|
80
|
+
content += `- Substitutes: ${primary.typography.display.substitutes.join(", ")}\n`;
|
|
81
|
+
content += `- Sizes: ${primary.typography.display.sizes.join(", ")}\n\n`;
|
|
82
|
+
record("typography-display", primary.typography.display.family, [primary.id], "adopted");
|
|
83
|
+
}
|
|
84
|
+
if (primary?.typography.body) {
|
|
85
|
+
content += `### Body\n- Family: ${primary.typography.body.family}\n`;
|
|
86
|
+
content += `- Substitutes: ${primary.typography.body.substitutes.join(", ")}\n`;
|
|
87
|
+
content += `- Sizes: ${primary.typography.body.sizes.join(", ")}\n\n`;
|
|
88
|
+
record("typography-body", primary.typography.body.family, [primary.id], "adopted");
|
|
89
|
+
}
|
|
90
|
+
// Shape
|
|
91
|
+
content += "## 5. Shape & Surface\n\n";
|
|
92
|
+
if (primary) {
|
|
93
|
+
content += `- Card radius: ${primary.shapeLanguage.cardRadius ?? "16px"}\n`;
|
|
94
|
+
content += `- Button radius: ${primary.shapeLanguage.buttonRadius ?? "8px"}\n`;
|
|
95
|
+
content += `- Shadow: ${primary.shapeLanguage.shadowStyle}\n\n`;
|
|
96
|
+
record("radius", primary.shapeLanguage.cardRadius ?? "16px", [primary.id], "adopted");
|
|
97
|
+
record("elevation", primary.shapeLanguage.shadowStyle, [primary.id], "adopted");
|
|
98
|
+
}
|
|
99
|
+
// Anti-patterns
|
|
100
|
+
content += "## 6. Anti-patterns\n\n";
|
|
101
|
+
const allAntiPatterns = [...new Set(fingerprints.flatMap((f) => f.antiPatterns))];
|
|
102
|
+
for (const ap of allAntiPatterns) {
|
|
103
|
+
content += `- ${ap}\n`;
|
|
104
|
+
}
|
|
105
|
+
record("anti-patterns", `${allAntiPatterns.length} rules`, fingerprints.map((f) => f.id), "derived");
|
|
106
|
+
// Hard Constraints
|
|
107
|
+
content += "\n## 7. Hard Constraints\n\n";
|
|
108
|
+
const allConstraints = [...new Set(fingerprints.flatMap((f) => f.hardConstraints))];
|
|
109
|
+
for (const hc of allConstraints) {
|
|
110
|
+
content += `- ${hc}\n`;
|
|
111
|
+
}
|
|
112
|
+
// Page-type strategy
|
|
113
|
+
if (fusionDecision.selectedStrategy === "page-type-split") {
|
|
114
|
+
content += "\n## 8. Page-type Strategy\n\n";
|
|
115
|
+
const roles = fusionDecision.finalReferenceRoles;
|
|
116
|
+
for (const [refId, role] of Object.entries(roles)) {
|
|
117
|
+
const fp = fingerprints.find((f) => f.id === refId);
|
|
118
|
+
if (fp) {
|
|
119
|
+
content += `- ${role === "primary" ? "Dashboard/App" : "Marketing/Landing"}: ${fp.name} style\n`;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
content += `\nUser notes: ${fusionDecision.userInstruction}\n`;
|
|
123
|
+
}
|
|
124
|
+
// Source Map Summary
|
|
125
|
+
content += "\n## 9. Source Map\n\n";
|
|
126
|
+
content += "| Decision ID | Dimension | Rule | Source | Treatment |\n";
|
|
127
|
+
content += "|-------------|-----------|------|--------|-----------|\n";
|
|
128
|
+
for (const d of decisions) {
|
|
129
|
+
content += `| ${d.decisionId} | ${d.dimension} | ${d.finalRule.slice(0, 60)} | ${d.sourceReferenceIds.join(", ")} | ${d.treatment} |\n`;
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
schemaVersion: SCHEMA_VERSION,
|
|
133
|
+
designPath: "/DESIGN.md",
|
|
134
|
+
fusionBriefPath: "/docs/design-references/design-fusion-brief.md",
|
|
135
|
+
sourceMapPath: "/docs/ui/design-source-map.md",
|
|
136
|
+
decisions,
|
|
137
|
+
content,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=DesignSystemSynthesizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DesignSystemSynthesizer.js","sourceRoot":"","sources":["../../src/design-docs/DesignSystemSynthesizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { StyleFingerprint, StyleConflictReport, FusionOption } from "@aibloom/schemas";
|
|
2
|
+
/**
|
|
3
|
+
* Generates 3-5 user-selectable fusion options when multiple design references
|
|
4
|
+
* have conflicts. Supports: primary-accent, page-type-split, layered-fusion,
|
|
5
|
+
* contextual-fusion, new-derived-system.
|
|
6
|
+
*/
|
|
7
|
+
export declare class FusionOptionGenerator {
|
|
8
|
+
generate(fingerprints: StyleFingerprint[], conflictReport: StyleConflictReport): FusionOption[];
|
|
9
|
+
private buildOption;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=FusionOptionGenerator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FusionOptionGenerator.d.ts","sourceRoot":"","sources":["../../src/design-docs/FusionOptionGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE5F;;;;GAIG;AACH,qBAAa,qBAAqB;IAChC,QAAQ,CACN,YAAY,EAAE,gBAAgB,EAAE,EAChC,cAAc,EAAE,mBAAmB,GAClC,YAAY,EAAE;IA8IjB,OAAO,CAAC,WAAW;CAyBpB"}
|