@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.
Files changed (62) hide show
  1. package/README.md +16 -0
  2. package/dist/design-docs/ConflictDetector.d.ts +21 -0
  3. package/dist/design-docs/ConflictDetector.d.ts.map +1 -0
  4. package/dist/design-docs/ConflictDetector.js +221 -0
  5. package/dist/design-docs/ConflictDetector.js.map +1 -0
  6. package/dist/design-docs/DesignDocParser.d.ts +17 -0
  7. package/dist/design-docs/DesignDocParser.d.ts.map +1 -0
  8. package/dist/design-docs/DesignDocParser.js +112 -0
  9. package/dist/design-docs/DesignDocParser.js.map +1 -0
  10. package/dist/design-docs/DesignSystemSynthesizer.d.ts +9 -0
  11. package/dist/design-docs/DesignSystemSynthesizer.d.ts.map +1 -0
  12. package/dist/design-docs/DesignSystemSynthesizer.js +141 -0
  13. package/dist/design-docs/DesignSystemSynthesizer.js.map +1 -0
  14. package/dist/design-docs/FusionOptionGenerator.d.ts +11 -0
  15. package/dist/design-docs/FusionOptionGenerator.d.ts.map +1 -0
  16. package/dist/design-docs/FusionOptionGenerator.js +157 -0
  17. package/dist/design-docs/FusionOptionGenerator.js.map +1 -0
  18. package/dist/design-docs/StyleFingerprintExtractor.d.ts +32 -0
  19. package/dist/design-docs/StyleFingerprintExtractor.d.ts.map +1 -0
  20. package/dist/design-docs/StyleFingerprintExtractor.js +365 -0
  21. package/dist/design-docs/StyleFingerprintExtractor.js.map +1 -0
  22. package/dist/design-docs/TokenNormalizer.d.ts +13 -0
  23. package/dist/design-docs/TokenNormalizer.d.ts.map +1 -0
  24. package/dist/design-docs/TokenNormalizer.js +97 -0
  25. package/dist/design-docs/TokenNormalizer.js.map +1 -0
  26. package/dist/errors.d.ts +7 -0
  27. package/dist/errors.d.ts.map +1 -0
  28. package/dist/errors.js +11 -0
  29. package/dist/errors.js.map +1 -0
  30. package/dist/framework/FrameworkAdapter.d.ts +10 -0
  31. package/dist/framework/FrameworkAdapter.d.ts.map +1 -0
  32. package/dist/framework/FrameworkAdapter.js +2 -0
  33. package/dist/framework/FrameworkAdapter.js.map +1 -0
  34. package/dist/framework/package.d.ts +8 -0
  35. package/dist/framework/package.d.ts.map +1 -0
  36. package/dist/framework/package.js +32 -0
  37. package/dist/framework/package.js.map +1 -0
  38. package/dist/index.d.ts +15 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +15 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/json.d.ts +5 -0
  43. package/dist/json.d.ts.map +1 -0
  44. package/dist/json.js +43 -0
  45. package/dist/json.js.map +1 -0
  46. package/dist/safety/FileChangeApplier.d.ts +8 -0
  47. package/dist/safety/FileChangeApplier.d.ts.map +1 -0
  48. package/dist/safety/FileChangeApplier.js +73 -0
  49. package/dist/safety/FileChangeApplier.js.map +1 -0
  50. package/dist/state/ProjectStateStore.d.ts +16 -0
  51. package/dist/state/ProjectStateStore.d.ts.map +1 -0
  52. package/dist/state/ProjectStateStore.js +164 -0
  53. package/dist/state/ProjectStateStore.js.map +1 -0
  54. package/dist/state/RunRecordStore.d.ts +10 -0
  55. package/dist/state/RunRecordStore.d.ts.map +1 -0
  56. package/dist/state/RunRecordStore.js +39 -0
  57. package/dist/state/RunRecordStore.js.map +1 -0
  58. package/dist/tasks/TaskStore.d.ts +12 -0
  59. package/dist/tasks/TaskStore.d.ts.map +1 -0
  60. package/dist/tasks/TaskStore.js +48 -0
  61. package/dist/tasks/TaskStore.js.map +1 -0
  62. package/package.json +24 -0
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Normalizes tokens across multiple StyleFingerprints for comparison.
3
+ * Merges synonymous color names, unifies spacing/radius units, detects conflicts.
4
+ */
5
+ export class TokenNormalizer {
6
+ normalize(fingerprints) {
7
+ const tokens = [];
8
+ for (const fp of fingerprints) {
9
+ // Color tokens
10
+ for (const hex of fp.colorSystem.canvas) {
11
+ tokens.push(this.makeToken(fp, "canvas", hex, "color"));
12
+ }
13
+ for (const hex of fp.colorSystem.surface) {
14
+ tokens.push(this.makeToken(fp, "surface", hex, "color"));
15
+ }
16
+ for (const hex of fp.colorSystem.accent) {
17
+ tokens.push(this.makeToken(fp, "accent", hex, "color"));
18
+ }
19
+ for (const hex of fp.colorSystem.text) {
20
+ tokens.push(this.makeToken(fp, "text", hex, "color"));
21
+ }
22
+ for (const hex of fp.colorSystem.mutedText) {
23
+ tokens.push(this.makeToken(fp, "muted-text", hex, "color"));
24
+ }
25
+ // Typography tokens
26
+ if (fp.typography.display) {
27
+ tokens.push(this.makeToken(fp, "display", fp.typography.display.family, "typography"));
28
+ }
29
+ if (fp.typography.body) {
30
+ tokens.push(this.makeToken(fp, "body", fp.typography.body.family, "typography"));
31
+ }
32
+ // Shape tokens
33
+ if (fp.shapeLanguage.cardRadius) {
34
+ tokens.push(this.makeToken(fp, "card-radius", fp.shapeLanguage.cardRadius, "radius"));
35
+ }
36
+ if (fp.shapeLanguage.buttonRadius) {
37
+ tokens.push(this.makeToken(fp, "button-radius", fp.shapeLanguage.buttonRadius, "radius"));
38
+ }
39
+ if (fp.shapeLanguage.shadowStyle) {
40
+ tokens.push(this.makeToken(fp, "shadow", fp.shapeLanguage.shadowStyle, "shadow"));
41
+ }
42
+ // Layout tokens
43
+ if (fp.layoutLanguage.maxWidth) {
44
+ tokens.push(this.makeToken(fp, "max-width", fp.layoutLanguage.maxWidth, "layout"));
45
+ }
46
+ if (fp.layoutLanguage.sectionGap) {
47
+ tokens.push(this.makeToken(fp, "section-gap", fp.layoutLanguage.sectionGap, "layout"));
48
+ }
49
+ }
50
+ return tokens;
51
+ }
52
+ makeToken(fp, name, value, dimension) {
53
+ return {
54
+ name,
55
+ value,
56
+ dimension,
57
+ standardizedValue: this.standardize(value, dimension),
58
+ sourceFingerprintId: fp.id,
59
+ };
60
+ }
61
+ standardize(value, dimension) {
62
+ switch (dimension) {
63
+ case "color":
64
+ return value.toLowerCase();
65
+ case "radius":
66
+ case "spacing":
67
+ // Convert to px number
68
+ return value.replace(/px$/, "");
69
+ case "shadow":
70
+ return value;
71
+ default:
72
+ return value.toLowerCase();
73
+ }
74
+ }
75
+ /** Detect conflicts between normalized tokens */
76
+ detectConflicts(tokens) {
77
+ const conflicts = [];
78
+ const seen = new Map();
79
+ for (const token of tokens) {
80
+ const key = `${token.dimension}:${token.name}`;
81
+ const existing = seen.get(key);
82
+ if (existing && existing.sourceFingerprintId !== token.sourceFingerprintId) {
83
+ if (existing.standardizedValue !== token.standardizedValue) {
84
+ token.conflictingWith = [existing.sourceFingerprintId];
85
+ existing.conflictingWith = existing.conflictingWith ?? [];
86
+ existing.conflictingWith.push(token.sourceFingerprintId);
87
+ conflicts.push(token);
88
+ }
89
+ }
90
+ else {
91
+ seen.set(key, token);
92
+ }
93
+ }
94
+ return conflicts;
95
+ }
96
+ }
97
+ //# sourceMappingURL=TokenNormalizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TokenNormalizer.js","sourceRoot":"","sources":["../../src/design-docs/TokenNormalizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export type VibeUIErrorCode = "NOT_INITIALIZED" | "FILE_NOT_FOUND" | "INVALID_JSON" | "SCHEMA_MISMATCH" | "UNSUPPORTED_SCHEMA_VERSION" | "INVALID_STATE" | "FRAMEWORK_NOT_DETECTED" | "DESIGN_SYSTEM_REQUIRED" | "TASK_NOT_FOUND" | "UNSAFE_FILE_CHANGE" | "COMMAND_FAILED";
2
+ export declare class VibeUIError extends Error {
3
+ readonly code: VibeUIErrorCode;
4
+ readonly details?: string | undefined;
5
+ constructor(code: VibeUIErrorCode, message: string, details?: string | undefined);
6
+ }
7
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GACvB,iBAAiB,GACjB,gBAAgB,GAChB,cAAc,GACd,iBAAiB,GACjB,4BAA4B,GAC5B,eAAe,GACf,wBAAwB,GACxB,wBAAwB,GACxB,gBAAgB,GAChB,oBAAoB,GACpB,gBAAgB,CAAC;AAErB,qBAAa,WAAY,SAAQ,KAAK;aAElB,IAAI,EAAE,eAAe;aAErB,OAAO,CAAC,EAAE,MAAM;gBAFhB,IAAI,EAAE,eAAe,EACrC,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE,MAAM,YAAA;CAKnC"}
package/dist/errors.js ADDED
@@ -0,0 +1,11 @@
1
+ export class VibeUIError extends Error {
2
+ code;
3
+ details;
4
+ constructor(code, message, details) {
5
+ super(message);
6
+ this.code = code;
7
+ this.details = details;
8
+ this.name = "VibeUIError";
9
+ }
10
+ }
11
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAaA,MAAM,OAAO,WAAY,SAAQ,KAAK;IAElB;IAEA;IAHlB,YACkB,IAAqB,EACrC,OAAe,EACC,OAAgB;QAEhC,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,SAAI,GAAJ,IAAI,CAAiB;QAErB,YAAO,GAAP,OAAO,CAAS;QAGhC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import type { DetectionResult, DevServerConfig, ImplementationTarget, PageShape, ProjectContext, VerificationCommand } from "@aibloom/schemas";
2
+ export interface FrameworkAdapter {
3
+ readonly id: ProjectContext["framework"];
4
+ detect(projectRoot: string): Promise<DetectionResult>;
5
+ inspect(projectRoot: string): Promise<ProjectContext>;
6
+ planTarget(page: PageShape, context: ProjectContext): Promise<ImplementationTarget>;
7
+ verificationCommands(context: ProjectContext): VerificationCommand[];
8
+ resolveDevServer(context: ProjectContext): DevServerConfig;
9
+ }
10
+ //# sourceMappingURL=FrameworkAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FrameworkAdapter.d.ts","sourceRoot":"","sources":["../../src/framework/FrameworkAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,SAAS,EACT,cAAc,EACd,mBAAmB,EACpB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC;IACzC,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACtD,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACtD,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACpF,oBAAoB,CAAC,OAAO,EAAE,cAAc,GAAG,mBAAmB,EAAE,CAAC;IACrE,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,eAAe,CAAC;CAC5D"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=FrameworkAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FrameworkAdapter.js","sourceRoot":"","sources":["../../src/framework/FrameworkAdapter.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ export interface PackageJson {
2
+ scripts?: Record<string, string>;
3
+ dependencies?: Record<string, string>;
4
+ devDependencies?: Record<string, string>;
5
+ }
6
+ export declare function readPackageJson(projectRoot: string): Promise<PackageJson>;
7
+ export declare function detectPackageManager(projectRoot: string): Promise<"pnpm" | "npm" | "yarn" | "bun">;
8
+ //# sourceMappingURL=package.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.d.ts","sourceRoot":"","sources":["../../src/framework/package.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AAED,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAW/E;AAED,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC,CAiBxG"}
@@ -0,0 +1,32 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { VibeUIError } from "../errors.js";
4
+ export async function readPackageJson(projectRoot) {
5
+ try {
6
+ const raw = await fs.readFile(path.join(projectRoot, "package.json"), "utf-8");
7
+ return JSON.parse(raw);
8
+ }
9
+ catch (error) {
10
+ throw new VibeUIError("FRAMEWORK_NOT_DETECTED", `Unable to read package.json in ${projectRoot}`, error instanceof Error ? error.message : String(error));
11
+ }
12
+ }
13
+ export async function detectPackageManager(projectRoot) {
14
+ const candidates = [
15
+ ["pnpm-lock.yaml", "pnpm"],
16
+ ["yarn.lock", "yarn"],
17
+ ["bun.lockb", "bun"],
18
+ ["bun.lock", "bun"],
19
+ ["package-lock.json", "npm"],
20
+ ];
21
+ for (const [file, manager] of candidates) {
22
+ try {
23
+ await fs.access(path.join(projectRoot, file));
24
+ return manager;
25
+ }
26
+ catch {
27
+ // Continue.
28
+ }
29
+ }
30
+ return "npm";
31
+ }
32
+ //# sourceMappingURL=package.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.js","sourceRoot":"","sources":["../../src/framework/package.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAQ3C,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,WAAmB;IACvD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC;QAC/E,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,WAAW,CACnB,wBAAwB,EACxB,kCAAkC,WAAW,EAAE,EAC/C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,WAAmB;IAC5D,MAAM,UAAU,GAAG;QACjB,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAC1B,CAAC,WAAW,EAAE,MAAM,CAAC;QACrB,CAAC,WAAW,EAAE,KAAK,CAAC;QACpB,CAAC,UAAU,EAAE,KAAK,CAAC;QACnB,CAAC,mBAAmB,EAAE,KAAK,CAAC;KACpB,CAAC;IACX,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,UAAU,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;YAC9C,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,15 @@
1
+ export * from "./errors.js";
2
+ export * from "./json.js";
3
+ export * from "./framework/FrameworkAdapter.js";
4
+ export * from "./framework/package.js";
5
+ export * from "./state/ProjectStateStore.js";
6
+ export * from "./state/RunRecordStore.js";
7
+ export * from "./tasks/TaskStore.js";
8
+ export * from "./safety/FileChangeApplier.js";
9
+ export * from "./design-docs/ConflictDetector.js";
10
+ export * from "./design-docs/DesignDocParser.js";
11
+ export * from "./design-docs/DesignSystemSynthesizer.js";
12
+ export * from "./design-docs/FusionOptionGenerator.js";
13
+ export * from "./design-docs/StyleFingerprintExtractor.js";
14
+ export * from "./design-docs/TokenNormalizer.js";
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,iCAAiC,CAAC;AAChD,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC;AAClD,cAAc,kCAAkC,CAAC;AACjD,cAAc,0CAA0C,CAAC;AACzD,cAAc,wCAAwC,CAAC;AACvD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,kCAAkC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,15 @@
1
+ export * from "./errors.js";
2
+ export * from "./json.js";
3
+ export * from "./framework/FrameworkAdapter.js";
4
+ export * from "./framework/package.js";
5
+ export * from "./state/ProjectStateStore.js";
6
+ export * from "./state/RunRecordStore.js";
7
+ export * from "./tasks/TaskStore.js";
8
+ export * from "./safety/FileChangeApplier.js";
9
+ export * from "./design-docs/ConflictDetector.js";
10
+ export * from "./design-docs/DesignDocParser.js";
11
+ export * from "./design-docs/DesignSystemSynthesizer.js";
12
+ export * from "./design-docs/FusionOptionGenerator.js";
13
+ export * from "./design-docs/StyleFingerprintExtractor.js";
14
+ export * from "./design-docs/TokenNormalizer.js";
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,iCAAiC,CAAC;AAChD,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC;AAClD,cAAc,kCAAkC,CAAC;AACjD,cAAc,0CAA0C,CAAC;AACzD,cAAc,wCAAwC,CAAC;AACvD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,kCAAkC,CAAC"}
package/dist/json.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ import type { ZodType } from "zod";
2
+ export declare function readJsonFile<T>(filePath: string, schema: ZodType<T>): Promise<T>;
3
+ export declare function writeJsonFile(filePath: string, value: unknown): Promise<void>;
4
+ export declare function pathExists(filePath: string): Promise<boolean>;
5
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAGnC,wBAAsB,YAAY,CAAC,CAAC,EAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GACjB,OAAO,CAAC,CAAC,CAAC,CA+BZ;AAED,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAKnF;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE"}
package/dist/json.js ADDED
@@ -0,0 +1,43 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { VibeUIError } from "./errors.js";
4
+ export async function readJsonFile(filePath, schema) {
5
+ let raw;
6
+ try {
7
+ raw = await fs.readFile(filePath, "utf-8");
8
+ }
9
+ catch (error) {
10
+ if (error.code === "ENOENT") {
11
+ throw new VibeUIError("FILE_NOT_FOUND", `File not found: ${filePath}`);
12
+ }
13
+ throw error;
14
+ }
15
+ let parsed;
16
+ try {
17
+ parsed = JSON.parse(raw);
18
+ }
19
+ catch (error) {
20
+ throw new VibeUIError("INVALID_JSON", `Invalid JSON: ${filePath}`, error instanceof Error ? error.message : String(error));
21
+ }
22
+ const result = schema.safeParse(parsed);
23
+ if (!result.success) {
24
+ throw new VibeUIError("SCHEMA_MISMATCH", `Schema validation failed: ${filePath}`, result.error.message);
25
+ }
26
+ return result.data;
27
+ }
28
+ export async function writeJsonFile(filePath, value) {
29
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
30
+ const tempPath = `${filePath}.tmp`;
31
+ await fs.writeFile(tempPath, `${JSON.stringify(value, null, 2)}\n`, "utf-8");
32
+ await fs.rename(tempPath, filePath);
33
+ }
34
+ export async function pathExists(filePath) {
35
+ try {
36
+ await fs.access(filePath);
37
+ return true;
38
+ }
39
+ catch {
40
+ return false;
41
+ }
42
+ }
43
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAgB,EAChB,MAAkB;IAElB,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,MAAM,IAAI,WAAW,CAAC,gBAAgB,EAAE,mBAAmB,QAAQ,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,WAAW,CACnB,cAAc,EACd,iBAAiB,QAAQ,EAAE,EAC3B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,WAAW,CACnB,iBAAiB,EACjB,6BAA6B,QAAQ,EAAE,EACvC,MAAM,CAAC,KAAK,CAAC,OAAO,CACrB,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB,EAAE,KAAc;IAClE,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,GAAG,QAAQ,MAAM,CAAC;IACnC,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7E,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type FileChange, type FileChangePlan } from "@aibloom/schemas";
2
+ export declare class FileChangeApplier {
3
+ private readonly projectRoot;
4
+ constructor(projectRoot?: string);
5
+ validate(changes: FileChange[], allowedWritePaths: string[]): void;
6
+ apply(taskId: string, changes: FileChange[], allowedWritePaths: string[]): Promise<FileChangePlan>;
7
+ }
8
+ //# sourceMappingURL=FileChangeApplier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileChangeApplier.d.ts","sourceRoot":"","sources":["../../src/safety/FileChangeApplier.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAC;AAgB1B,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAAX,WAAW,SAAgB;IAExD,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,IAAI;IAgB5D,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC;CAwCzG"}
@@ -0,0 +1,73 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { FileChangePlanSchema, SCHEMA_VERSION, } from "@aibloom/schemas";
4
+ import { VibeUIError } from "../errors.js";
5
+ import { pathExists, writeJsonFile } from "../json.js";
6
+ function resolveSafePath(projectRoot, relativePath) {
7
+ const resolved = path.resolve(projectRoot, relativePath);
8
+ const root = path.resolve(projectRoot);
9
+ if (resolved !== root && !resolved.startsWith(`${root}${path.sep}`)) {
10
+ throw new VibeUIError("UNSAFE_FILE_CHANGE", `Path escapes project root: ${relativePath}`);
11
+ }
12
+ if (relativePath.startsWith(".git/") || relativePath === ".git") {
13
+ throw new VibeUIError("UNSAFE_FILE_CHANGE", "Changes inside .git are forbidden");
14
+ }
15
+ return resolved;
16
+ }
17
+ export class FileChangeApplier {
18
+ projectRoot;
19
+ constructor(projectRoot = process.cwd()) {
20
+ this.projectRoot = projectRoot;
21
+ }
22
+ validate(changes, allowedWritePaths) {
23
+ for (const change of changes) {
24
+ const resolved = resolveSafePath(this.projectRoot, change.path);
25
+ const allowed = allowedWritePaths.some((allowedPath) => {
26
+ const allowedRoot = path.resolve(this.projectRoot, allowedPath);
27
+ return resolved === allowedRoot || resolved.startsWith(`${allowedRoot}${path.sep}`);
28
+ });
29
+ if (!allowed) {
30
+ throw new VibeUIError("UNSAFE_FILE_CHANGE", `Path is outside task allowlist: ${change.path}`);
31
+ }
32
+ if (change.action !== "delete" && change.content === undefined) {
33
+ throw new VibeUIError("UNSAFE_FILE_CHANGE", `Missing content for ${change.action}: ${change.path}`);
34
+ }
35
+ }
36
+ }
37
+ async apply(taskId, changes, allowedWritePaths) {
38
+ this.validate(changes, allowedWritePaths);
39
+ const timestamp = Date.now();
40
+ const planId = `plan-${timestamp}`;
41
+ const backupRoot = path.join(".vibeui", "backups", planId);
42
+ const plannedChanges = [];
43
+ for (const change of changes) {
44
+ const target = resolveSafePath(this.projectRoot, change.path);
45
+ let backupPath;
46
+ if (await pathExists(target)) {
47
+ backupPath = path.join(backupRoot, change.path);
48
+ const backupTarget = resolveSafePath(this.projectRoot, backupPath);
49
+ await fs.mkdir(path.dirname(backupTarget), { recursive: true });
50
+ await fs.copyFile(target, backupTarget);
51
+ }
52
+ if (change.action === "delete") {
53
+ await fs.rm(target, { force: true });
54
+ }
55
+ else {
56
+ await fs.mkdir(path.dirname(target), { recursive: true });
57
+ await fs.writeFile(target, change.content ?? "", "utf-8");
58
+ }
59
+ plannedChanges.push({ ...change, backupPath });
60
+ }
61
+ const plan = FileChangePlanSchema.parse({
62
+ schemaVersion: SCHEMA_VERSION,
63
+ planId,
64
+ taskId,
65
+ changes: plannedChanges,
66
+ status: "applied",
67
+ createdAt: new Date(timestamp).toISOString(),
68
+ });
69
+ await writeJsonFile(path.join(this.projectRoot, ".vibeui", "runs", "file-changes", `${planId}.json`), plan);
70
+ return plan;
71
+ }
72
+ }
73
+ //# sourceMappingURL=FileChangeApplier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileChangeApplier.js","sourceRoot":"","sources":["../../src/safety/FileChangeApplier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type DesignReferenceIndexEntry, type FrameworkId, type PageState, type ProjectStage, type ProjectState } from "@aibloom/schemas";
2
+ export declare function createDefaultState(): ProjectState;
3
+ export declare class ProjectStateStore {
4
+ private readonly statePath;
5
+ constructor(projectRoot?: string);
6
+ exists(): Promise<boolean>;
7
+ read(): Promise<ProjectState>;
8
+ write(state: ProjectState): Promise<ProjectState>;
9
+ initialize(projectName?: string, framework?: FrameworkId | null): Promise<ProjectState>;
10
+ update(mutator: (state: ProjectState) => ProjectState): Promise<ProjectState>;
11
+ setProjectStage(projectStage: ProjectStage): Promise<ProjectState>;
12
+ addDesignReference(reference: DesignReferenceIndexEntry): Promise<ProjectState>;
13
+ upsertPage(page: PageState): Promise<ProjectState>;
14
+ getPage(slugOrId: string): Promise<PageState>;
15
+ }
16
+ //# sourceMappingURL=ProjectStateStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectStateStore.d.ts","sourceRoot":"","sources":["../../src/state/ProjectStateStore.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,yBAAyB,EAC9B,KAAK,WAAW,EAEhB,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAU1B,wBAAgB,kBAAkB,IAAI,YAAY,CAgBjD;AAoED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,WAAW,SAAgB;IAIjC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAI1B,IAAI,IAAI,OAAO,CAAC,YAAY,CAAC;IAgB7B,KAAK,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAMjD,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC;IAWvF,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAI7E,eAAe,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAIlE,kBAAkB,CAAC,SAAS,EAAE,yBAAyB,GAAG,OAAO,CAAC,YAAY,CAAC;IAY/E,UAAU,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC;IAQlD,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;CAQpD"}
@@ -0,0 +1,164 @@
1
+ import path from "node:path";
2
+ import { LegacyProjectStateSchema, ProjectStateSchema, SCHEMA_VERSION, } from "@aibloom/schemas";
3
+ import { VibeUIError } from "../errors.js";
4
+ import { pathExists, readJsonFile, writeJsonFile } from "../json.js";
5
+ const STATE_PATH = ".vibeui/state.json";
6
+ function now() {
7
+ return new Date().toISOString();
8
+ }
9
+ export function createDefaultState() {
10
+ const timestamp = now();
11
+ return {
12
+ schemaVersion: SCHEMA_VERSION,
13
+ version: "0.2.0",
14
+ projectStage: "uninitialized",
15
+ projectName: null,
16
+ framework: null,
17
+ designReferences: [],
18
+ activeDesignSystem: null,
19
+ fusionDecision: null,
20
+ pages: [],
21
+ runs: [],
22
+ createdAt: timestamp,
23
+ updatedAt: timestamp,
24
+ };
25
+ }
26
+ function mapLegacyStage(stage) {
27
+ if (stage === "uninitialized")
28
+ return "uninitialized";
29
+ if (stage === "initialized")
30
+ return "initialized";
31
+ if (stage === "design_references_imported")
32
+ return "design_references_imported";
33
+ if (stage === "design_references_analyzed" || stage === "design_conflicts_detected") {
34
+ return "design_references_analyzed";
35
+ }
36
+ if (stage === "fusion_decision_required")
37
+ return "fusion_decision_required";
38
+ if (stage === "fusion_decision_recorded" ||
39
+ stage === "design_system_synthesized" ||
40
+ stage === "product_spec_ready" ||
41
+ stage === "page_shape_ready" ||
42
+ stage === "implementation_planned" ||
43
+ stage === "code_generated" ||
44
+ stage === "components_extracted" ||
45
+ stage === "motion_enhanced" ||
46
+ stage === "hardened" ||
47
+ stage === "verified" ||
48
+ stage === "repair_required" ||
49
+ stage === "completed") {
50
+ return "design_system_synthesized";
51
+ }
52
+ return "initialized";
53
+ }
54
+ function migrateLegacyState(legacy) {
55
+ const timestamp = now();
56
+ return {
57
+ schemaVersion: SCHEMA_VERSION,
58
+ version: "0.2.0",
59
+ projectStage: mapLegacyStage(legacy.stage),
60
+ projectName: legacy.projectName,
61
+ framework: null,
62
+ designReferences: legacy.designReferences,
63
+ activeDesignSystem: legacy.activeDesignSystem,
64
+ fusionDecision: legacy.fusionDecision,
65
+ pages: legacy.pages.map((page, index) => {
66
+ const slug = page.route.replace(/^\/+/, "") || `page-${index + 1}`;
67
+ const artifactDir = path.dirname(page.shapePath ?? `pages/${slug}/PAGE_SHAPE.md`);
68
+ return {
69
+ id: `page-${slug}`,
70
+ name: page.name,
71
+ slug,
72
+ route: `/${slug}`,
73
+ framework: "next",
74
+ stage: "planned",
75
+ prompt: page.name,
76
+ artifactDir,
77
+ shapePath: page.shapePath ?? path.join(artifactDir, "PAGE_SHAPE.md"),
78
+ implementationPlanPath: path.join(artifactDir, "IMPLEMENTATION_PLAN.md"),
79
+ implementationPromptPath: page.implementationPromptPath ?? path.join(artifactDir, "IMPLEMENTATION_PROMPT.md"),
80
+ activeTaskId: null,
81
+ repairAttempts: 0,
82
+ lastVerificationReport: null,
83
+ createdAt: legacy.createdAt,
84
+ updatedAt: timestamp,
85
+ };
86
+ }),
87
+ runs: legacy.runs,
88
+ createdAt: legacy.createdAt,
89
+ updatedAt: timestamp,
90
+ };
91
+ }
92
+ export class ProjectStateStore {
93
+ statePath;
94
+ constructor(projectRoot = process.cwd()) {
95
+ this.statePath = path.join(projectRoot, STATE_PATH);
96
+ }
97
+ async exists() {
98
+ return pathExists(this.statePath);
99
+ }
100
+ async read() {
101
+ if (!(await this.exists()))
102
+ return createDefaultState();
103
+ try {
104
+ return await readJsonFile(this.statePath, ProjectStateSchema);
105
+ }
106
+ catch (error) {
107
+ if (error instanceof VibeUIError && error.code === "SCHEMA_MISMATCH") {
108
+ const legacy = await readJsonFile(this.statePath, LegacyProjectStateSchema);
109
+ const migrated = migrateLegacyState(legacy);
110
+ await this.write(migrated);
111
+ return migrated;
112
+ }
113
+ throw error;
114
+ }
115
+ }
116
+ async write(state) {
117
+ const next = ProjectStateSchema.parse({ ...state, updatedAt: now() });
118
+ await writeJsonFile(this.statePath, next);
119
+ return next;
120
+ }
121
+ async initialize(projectName, framework) {
122
+ const state = await this.read();
123
+ const next = {
124
+ ...state,
125
+ projectStage: state.projectStage === "uninitialized" ? "initialized" : state.projectStage,
126
+ projectName: projectName ?? state.projectName,
127
+ framework: framework ?? state.framework,
128
+ };
129
+ return this.write(next);
130
+ }
131
+ async update(mutator) {
132
+ return this.write(mutator(await this.read()));
133
+ }
134
+ async setProjectStage(projectStage) {
135
+ return this.update((state) => ({ ...state, projectStage }));
136
+ }
137
+ async addDesignReference(reference) {
138
+ return this.update((state) => {
139
+ const designReferences = state.designReferences.filter((item) => item.id !== reference.id);
140
+ designReferences.push(reference);
141
+ return {
142
+ ...state,
143
+ designReferences,
144
+ projectStage: "design_references_imported",
145
+ };
146
+ });
147
+ }
148
+ async upsertPage(page) {
149
+ return this.update((state) => {
150
+ const pages = state.pages.filter((item) => item.id !== page.id && item.slug !== page.slug);
151
+ pages.push({ ...page, updatedAt: now() });
152
+ return { ...state, pages };
153
+ });
154
+ }
155
+ async getPage(slugOrId) {
156
+ const state = await this.read();
157
+ const page = state.pages.find((item) => item.slug === slugOrId || item.id === slugOrId);
158
+ if (!page) {
159
+ throw new VibeUIError("INVALID_STATE", `Page not found: ${slugOrId}`);
160
+ }
161
+ return page;
162
+ }
163
+ }
164
+ //# sourceMappingURL=ProjectStateStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectStateStore.js","sourceRoot":"","sources":["../../src/state/ProjectStateStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type RunRecord } from "@aibloom/schemas";
2
+ export declare class RunRecordStore {
3
+ private readonly runsDir;
4
+ constructor(projectRoot?: string);
5
+ append(run: RunRecord): Promise<void>;
6
+ get(runId: string): Promise<RunRecord | null>;
7
+ list(): Promise<RunRecord[]>;
8
+ lastRun(): Promise<RunRecord | null>;
9
+ }
10
+ //# sourceMappingURL=RunRecordStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunRecordStore.d.ts","sourceRoot":"","sources":["../../src/state/RunRecordStore.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGnE,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,WAAW,SAAgB;IAIjC,MAAM,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrC,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAQ7C,IAAI,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAc5B,OAAO,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;CAI3C"}